dongyun3805 2018-11-06 12:56 采纳率: 0%
浏览 19

无法插入具有多对多关系的类别类型

I'm trying to insert my category type into my message when I post it. The problem is that it won't add to the message.

This is my post in my MessageController:

public function postMessage(Request $request)
{
    $message = new Message();
    $form = $this->createForm(MessageType::class, $message);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $message->setDate(new \DateTime());
        $message->setDownVotes(0);
        $message->setUpVotes(0);

        if($message->getUser() != null) {
            $message->setUser($this->getDoctrine()->getManager()->getRepository(User::class)->find($message->getUser()->getId()));
        } else {
            return $this->redirectToRoute('loginroute');
        }
        $entityManager->persist($message);
        $entityManager->flush();

        return $this->redirectToRoute('getAllMessages');
    }
}

In my view I make a select field like this:

{{ form_widget(categoryForm.name, { 'attr': {'class': 'mdl-textfield__input'} }) }}
<label for="message_content" class="mdl-textfield__label">Voeg bericht toe</label>

Which is created from the CategoryType with createForm:

class CategoryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', EntityType::class, array(
            'class' => Category::class,
            'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('m')->orderBy('m.name', "ASC");
            },
            'choice_label' => 'name','label' => false));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' =>  Category::class,
        ]);
    }
}

How am I supposed to insert the category as a many to many relation in the database?

EDIT Message Entity:

/**
 * @ORM\Entity(repositoryClass="App\Repository\MessageRepository")
 */
class Message
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="text")
     */
    private $content;
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Category", cascade={"persist"}, inversedBy="messages")
     */
    private $categories;
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="text")
     */
    private $content;

    ----

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


    /**
     * @return Collection|Category[]
     */
    public function getCategories(): Collection
    {
        return $this->categories;
    }
    public function addCategory(Category $category)
    {
        $category->addMessage($this);
        /*if (!$this->categories->contains($category)) {
            $this->categories[] = $category;
        }
        return $this;*/
    }
    public function removeCategory(Category $category): self
    {
        if ($this->categories->contains($category)) {
            $this->categories->removeElement($category);
        }
        return $this;
    }
    public function __toString()
    {


 return "Entity Message, id= " . $this->getId();
}

Category entity:

/**
 * @ORM\Entity(repositoryClass="App\Repository\CategoryRepository")
 */
class Category
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;
    /**
     * @ORM\ManyToMany(targetEntity="App\Entity\Message", mappedBy="categories")
     */
    private $messages;
    public function __construct()
    {
        $this->messages = new ArrayCollection();
    }
    public function create(int $id, string $name)
    {
        $this->setName($name);
        $this->$id=$id;
        $this->messages = 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;
    }
    /**
     * @return Collection|Message[]
     */
    public function getMessages(): Collection
    {
        return $this->messages;
    }
    public function addMessage(Message $message)
    {
        if (!$this->messages->contains($message)) {
            $this->messages->add($message);
        }
/*        if (!$this->messages->contains($message)) {
            $this->messages[] = $message;
            $message->addCategory($this);
        }
        return $this;*/
    }
    public function removeMessage(Message $message): self
    {
        if ($this->messages->contains($message)) {
            $this->messages->removeElement($message);
            $message->removeCategory($this);
        }
        return $this;
    }
    public function __toString()
    {
        return "Entity Category, name= " . $this->getName();
    }
}

EDIT 2:

class MessageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('id', HiddenType::class, array('label' => false))
            ->add('content', TextType::class, array('required' => false, 'label' => false))
            ->add('date', HiddenType::class, array('required' => false, 'label' => false))
            ->add('upVotes', HiddenType::class, array('required' => false, 'label' => false))
            ->add('downVotes', HiddenType::class, array('required' => false, 'label' => false))
            ->add('categories', CollectionType::class, array(
                'entry_type' => CategoryType::class,
                'entry_options' => array('label' => false),
                'allow_add' => true,
                'by_reference' => false
            ))
            ->add('user', CommentUserType::class, array('required' => false, 'label' => false));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Message::class,
        ]);
    }
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
    • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
    • ¥15 CSAPPattacklab
    • ¥15 一直显示正在等待HID—ISP
    • ¥15 Python turtle 画图
    • ¥15 关于大棚监测的pcb板设计
    • ¥15 stm32开发clion时遇到的编译问题
    • ¥15 lna设计 源简并电感型共源放大器
    • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
    • ¥15 Vue3地图和异步函数使用