Не удается вставить тип категории со многими отношениями ко многим - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь вставить свой тип категории в свое сообщение при публикации. Проблема в том, что это не добавит к сообщению.

Это мой пост в моем 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');
    }
}

На мой взгляд, я делаю поле выбора следующим образом:

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

Который создается из CategoryType с помощью 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,
        ]);
    }
}

Как я могу вставить категорию как отношение многих ко многим в базу данных?

Редактировать объект сообщения:

/**
 * @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();
}

Категория объекта:

/**
 * @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();
    }
}

РЕДАКТИРОВАТЬ 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,
        ]);
    }
}
...