symfony 4 Expected argument of type entity, ArrayCollection given at property path

112
06 июля 2021, 07:30

Совсем отчаялся найти в чем ошибка Создаю форму, включающую в себя другую форму через CollectionType Свойство 'by_reference' => false установить не забыл Связь один ко многим. Но при сохранении получаю ошибку: Expected argument of type "App\Entity\TourDates", "Doctrine\Common\Collections\ArrayCollection" given at property path "tourDates".

Все дело в том что используется свойство entity set, в не add как должно быть.

namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
class Tours
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\TourDates", mappedBy="tourId", cascade={"persist"})
     */
    private $tourDates;
    public function __construct()
    {
        $this->tourDates = new ArrayCollection();        
    }
    /**
     * @return mixed
     */
    public function getTourDates()
    {
        return $this->tourDates;
    }
    /**
     * @param mixed $tourDates
     */
    public function setTourDates(TourDates $tourDates): void
    {
        $this->tourDates = $tourDates;
    }
    public function addTourDates(TourDates $tourDates)
    {
        $tourDates->setTourId($this);
        $this->tourDates->add($tourDates);
    }
    public function removeTourDates(TourDates $tourDates)
    {
        $this->tourDates->removeElement($tourDates);
    }
}
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Table(name="tour_dates")
 * @ORM\Entity(repositoryClass="App\Repository\TourDatesRepository")
 */
class TourDates
{
    /**
     * @var integer
     *
     * @ORM\ManyToOne(targetEntity="App\Entity\Tours", inversedBy="tourDates", cascade={"persist"})
     * @ORM\JoinColumn(name="tour_id", referencedColumnName="id", nullable=false)
     */
    private $tourId;
    /**
     * @return int
     */
    public function getTourId()
    {
        return $this->tourId;
    }
    /**
     * @param Tours $tourId
     */
    public function setTourId(Tours $tourId)
    {
        $this->tourId = $tourId;
    }

    public function addTourId(Tours $tourId)
    {
        if (!$this->tourId->contains($tourId)) {
            $this->tourId->add($tourId);
        }
    }
}
namespace App\Form;
class ToursType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('tourDates', CollectionType::class, [
                "label" => false,
                "entry_type" => TourDatesType::class,
                'entry_options' => [
                    'label' => 'Даты проведения'
                ],
                'allow_add' => true,
                'by_reference' => false,
                'allow_delete'   => true,
                'delete_empty' => true
            ])
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Tours::class,
        ]);
    }
}

И контроллер

public function new(Request $request): Response
    {
        $tours = new Tours();
        $tourDates = new TourDates();
        $tours->addTourDates($tourDates);
        $tours->setUserId($this->getUser());
        $tours->setDateUpdate(new \DateTime(date("Y-m-d H:i:s")));
        $form = $this->createForm(ToursType::class, $tours)
            ->add('saveAndCreateNew', SubmitType::class);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($tours);
            $em->flush();
            if ($form->get('saveAndCreateNew')->isClicked()) {
                return $this->redirectToRoute('tours_new');
            }
            return $this->redirectToRoute('tours');
        }
        return $this->render('admin/tours/index.html.twig', [
            'form' => $form->createView(),
        ]);
    }

Заранее спасибо за помощь!

Answer 1

В общем методом и проб и ошибок выяснилось что symfony как-то не так относится к именованием параметров если они во множественном числе(tourDate'S'). Изменив наименование параметра связи и всех сопутствующих методов с tourDates на tourDate все заработало.

READ ALSO
Вызвать метод без повторного ввода данных

Вызвать метод без повторного ввода данных

У меня есть два класса, main и Lesson7В классе Lesson7 у меня есть три метода:

84
Как сервису работать с БД Room?

Как сервису работать с БД Room?

Use case: приложение получает текст, отправляет его на сервер и получает аудиофайлыЭти аудиофайлы должны сохраняться на устройстве и uri этих...

102
Запуск jar (Swing) приложения на машине клиента (Windows)

Запуск jar (Swing) приложения на машине клиента (Windows)

Есть задача - собрать jar file так, чтобы он запускается на машине клиента - WindowsУ меня jar file запускается (двойным кликом или через командную строку...

84
Error 404. The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. Ошибка

Error 404. The origin server did not find a current representation for the target resource or is not willing to disclose that one exists. Ошибка

Ребята помогите уже все перебробовал, но ничего не работаетКогда ввожу localhost:8080 страница откривается, а когда localhost:8080/page -вилетает Error 404

113