首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony6 FindBy和实体多到多

Symfony6 FindBy和实体多到多
EN

Stack Overflow用户
提问于 2022-04-18 18:34:06
回答 2查看 127关注 0票数 0

我第一次在php 8.0.17中使用symfony6。我想做一个小表单,允许我检索“卡片”对象。我的“卡片”对象被绑定到许多颜色属性。我以为可以通过findBy检索cards对象,但我有以下错误:警告:尝试访问null类型值的数组偏移量。我看了文档,但我不明白我的错误是从哪里来的。

findBy不能与相关对象一起使用吗?或者在形式上使用实体字段不是个好主意?正如你所看到的,代码很简单,而且我不明白,这是不对的

守则如下:

我的信用卡实体:

代码语言:javascript
复制
<?php

namespace App\Entity;

use App\Repository\CardRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

#[ORM\Entity(repositoryClass: CardRepository::class)]
class Card
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\ManyToMany(targetEntity: Color::class, inversedBy: 'card')]
    private $color;

    public function __construct()
    {
        $this->color = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    /**
     * @return Collection<int, Color>
     */
    public function getColor(): Collection
    {
        return $this->color;
    }

    public function addColor(Color $color): self
    {
        if (!$this->color->contains($color)) {
            $this->color[] = $color;
        }

        return $this;
    }

    public function removeColor(Color $color): self
    {
        $this->color->removeElement($color);

        return $this;
    }
}

我的颜色实体:

代码语言:javascript
复制
<?php

namespace App\Entity;

use App\Repository\ColorRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity(repositoryClass: ColorRepository::class)]
class Color
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: 'integer')]
    private $id;

    #[ORM\Column(type: 'string', length: 255)]
    private $name;

    #[ORM\ManyToMany(targetEntity: Card::class, mappedBy: 'color')]
    private $card;

    public function __construct()
    {
        $this->card = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function __toString()
    {
        return $this->getName();
    }

    /**
     * @return Collection<int, Card>
     */
    public function getCard(): Collection
    {
        return $this->card;
    }

    public function addCard(Cards $card): self
    {
        if (!$this->card->contains($card)) {
            $this->card[] = $card;
            $card->addColor($this);
        }

        return $this;
    }

    public function removeCard(Cards $card): self
    {
        if ($this->cards->removeElement($card)) {
            $card->removeColor($this);
        }

        return $this;
    }
}

我的搜索表格:

代码语言:javascript
复制
<?php

namespace App\Form;

use App\Entity\Color;
use App\Entity\Keyword;
use App\Entity\Type;
use App\Form\DataTransformer\ColorToStringTransformer;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;

class CardSearchType extends AbstractType
{
    
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('name', TextType::class, ['required' => false])
            ->add('color', EntityType::class, [
                'class' => Color::class,
                // uses the Cards.name property as the visible option string
                'choice_label' => 'name',
                // used to render a select box, check boxes or radios
                // 'multiple' => true,
                // 'expanded' => true,
                // To add little test for empty value
                'placeholder' => 'Choose a color.',
                'required' => false,
            ])
            ->add('save', SubmitType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver): void
    {

    }
}

并完成控制器的操作:

代码语言:javascript
复制
class DeckBuilderController extends AbstractController
{
    #[Route('/deck/builder', name: 'app_deck_builder')]
    public function index(Request $request, CardRepository $cardRepository): Response
    {
        $form = $this->createForm(CardSearchType::class);
        $form->handleRequest($request);
        $cards = null;
        if ($form->isSubmitted() && $form->isValid())
        {
            // $form->getData() holds the submitted values
            $cardData = $form->getData();
            $cards = $cardRepository->findBy($cardData); => error Warning: Trying to access array offset on value of type null
            
        }
        return $this->render('deck_builder/index.html.twig', [
            'controller_name' => 'DeckBuilderController',
            'form' => $form->createView(),
            'cards' => $cards,
        ]);
    }

提前感谢您的答复。

EN

回答 2

Stack Overflow用户

发布于 2022-04-18 23:49:00

$form->getData()不返回数组,而是返回具有表单内容的对象。我猜你想用$form->get('color')->getData()代替

纠正你的代码,我会尝试这样的方法:

代码语言:javascript
复制
public function index(Request $request, CardRepository $cardRepository): Response {
    $cards = array();
    $form = $this->createForm(CardSearchType::class);
    $form->handleRequest($request);

    if($form->isSubmitted() && $form->isValid()) {
        $cards = $cardRepository->findBy(array('color'=>$form->get('color')->getData()));
    }

    return $this->renderForm('deck_builder/index.html.twig', array(
        'controller_name' => 'DeckBuilderController',
        'form' => $form,
        'cards' => $cards,
    ));
}
票数 0
EN

Stack Overflow用户

发布于 2022-05-04 08:21:48

为了解决我的问题,我最终手工创建了一个查询,并在DQL中进行了连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71915701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档