Ошибка типа с отношением ArrayCollection / OneToMany в Symfony 3.4 - PullRequest
0 голосов
/ 19 ноября 2018

Последние пару дней я пытался создать двунаправленные отношения ManyToOne-OneToMany в Symfony 3.4. У меня есть две сущности.Один - это вклад, а другой - источник.Вклад может иметь несколько источников.Таким образом, отношение должно быть

Contribution - ManyToOne - Source - OneToMany - Contribution

Но я продолжаю получать следующую ошибку во время $em→flush(); в моем контроллере:

Ошибка типа: аргумент 1, передаваемый в Doctrine \ Common \ Collections \ ArrayCollection :: __ construct (), должен иметь массив типов, данный объект вызывается в / var / www / html / Edebate / vendor / doctrine /orm / lib / Doctrine / ORM / UnitOfWork.php в строке 605

У меня нет метода set, связанного с коллекцией Array, в моем Entity Contribution, как я мог видеть в других постах здесь:

Ошибка типа: Аргумент 1 передан в Doctrine \ Common \ Collections \ ArrayCollection :: __ construct () должен иметь массив типов, данный объект

Symfony-CatchableНеустранимая ошибка: Аргумент 1, передаваемый в Doctrine \ Common \ Collections \ ArrayCollection :: __ construct (), должен иметь тип массива, заданный объект

И аннотации в порядке, как указано здесь:

Ошибка отношений Doctrine OneToMany

Любая помощь будет признательна!:)

Вот мой вклад сущности

use Doctrine\Common\Collections\ArrayCollection;

//annotations

  abstract class Contribution
    {

    /**
    * @ORM\OneToMany(targetEntity="Shaker\DebateBundle\Entity\Source", mappedBy="parent")
    */
    protected $sources;

//Other attributes and methods


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


    /**
     * Add source
     *
     * @param \Shaker\DebateBundle\Entity\Source $source
     *
     * @return Contribution
     */
    public function addSource(\Shaker\DebateBundle\Entity\Source $source)
    {
        $this->sources[] = $source;
        return $this;
    }

    /**
     * Remove source
     *
     * @param \Shaker\DebateBundle\Entity\Source $source
     */
    public function removeSource(\Shaker\DebateBundle\Entity\Source $source)
    {
        $this->sources->removeElement($source);
    }

    /**
     * Get sources
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getSources()
    {
        return $this->sources;
    }
}

И это в моем источнике сущности:

/**
* @ORM\ManyToOne(targetEntity="Shaker\DebateBundle\Entity\Contribution", inversedBy="sources")
*/
protected $parent;

   /**
     * Set parent
     *
     * @param \Shaker\DebateBundle\Entity\Contribution $parent
     *
     * @return Contribution
     */
    public function setParent(\Shaker\DebateBundle\Entity\Contribution $parent = null)
    {
        $this->parent = $parent;
        $parent->addSource($this);
        return $this;
    }

    /**
     * Get parent
     *
     * @return \Shaker\JRQBundle\Entity\Contribution
     */
    public function getParent()
    {
        return $this->parent;
    }

И в моем контроллере проблема возникает с flush:

        $formsourcebook->handleRequest($request);
        $contributionid=$formsourcebook->get('ContributionId')->getData();

        if ($formsourcebook->isValid()) {
            $topicargtarget=$this->getContribution($contributionid);
            $sourcebook->setUser($user);
            $sourcebook->setContribution($topicargtarget);
            $em->persist($sourcebook);
            $em->flush();
        }

Ответы [ 2 ]

0 голосов
/ 19 июля 2019

Я думаю, что вы "переключили" логику при работе с коллекциями.Вот как я думаю, ваш метод «add» должен выглядеть следующим образом:

public function addSource(\Shaker\DebateBundle\Entity\Source $source)
{
    $this->sources[] = $source;
    $source->setParent($this);

    return $this;
}

А в другом объекте:

public function setParent(\Shaker\DebateBundle\Entity\Contribution $parent = null)
{
    $this->parent = $parent;

    return $this;
}

В вашем фрагменте контроллера отсутствуют переменные вместе с формойопределения полей, так что вы не должны так много работать после отправки формы.Попробуйте напрямую отобразить столько полей, сколько сможете (даже с помощью автоматического определения), и даже если это выглядит некрасиво, но работает, но тогда вы можете украсить позже.Просто мои два цента с задержкой в ​​несколько месяцев.

0 голосов
/ 19 ноября 2018

Я не очень хорошо знаю ваш вопрос. Тем не менее, вы пытались с этим синтаксисом в сущности источника?

private $parent;
// ...

public function __construct() {
    $this->parent = new ArrayCollection();
    // or new \Doctrine\Common\Collections\ArrayCollection();
}

Я думаю, вы забыли конструктор в классе.

...