ORMInvalidArgumentException при попытке установить связанные объекты в фикстурах Doctrine - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в Symfony и Doctrine.У меня есть несколько разных связанных сущностей, но когда я пытаюсь связать их в Fixtures, я получаю исключение:

Ожидаемое значение типа «App \ Entity \ VehicleType» для поля ассоциации «App \»Entity \ Make # $ type ", вместо этого получил" Doctrine \ Common \ Collections \ ArrayColl
ection ".

Это, похоже, выдается, как только я вызываю $ manager-> flush ()во втором креплении.Я использовал генератор сущностей, чтобы установить их и отношения.После этого я добавил JoinColumn в аннотации ManyToOne.Эти отношения настроены так:

class VehicleType
{
    /** 
     * @ORM\OneToMany(targetEntity="App\Entity\Make", mappedBy="type")
     */
    private $make;

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

class make
{

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\VehicleType", inversedBy="make")
     * @ORM\JoinColumn(name="type", referencedColumnName="code")
     */
    private $type;

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

И приборы выглядят так:

class VehicleTypeFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $vehicleTypesData = AppFixtures::loadJSON('vehicle_types.json');

        foreach($vehicleTypesData as $type) {
            $vehicleType = new VehicleType();
            $vehicleType->setCode($type->code);
            $vehicleType->setDescription($type->description);
            $manager->persist($vehicleType);
            $this->addReference('type-'.$type->code, $vehicleType);
        }

        $manager->flush();
    }
}

class MakeFixtures extends Fixture implements DependentFixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $makes = AppFixtures::loadJSON('makes.json');

        foreach($makes as $make) {
            $newMake = new Make();
            $newMake->setCode($make->code);
            $newMake->setDescription($make->description);

            $type = (!empty($this->hasReference('type-'.$make->type)))
                ? $this->getReference('type-'.$make->type)
                : false;
            if ($type) {
                $newMake->setType($type);
            }

            $manager->persist($newMake);
        }

        $manager->flush();
    }
}

Я вижу в консоли, что они определенно выполняются в правильном порядке.Ясно, что я устанавливаю $this->make и $this->type в new ArrayCollection() с в конструкторах, но это было добавлено генератором сущностей, и это похоже на то, что я хочу.

Когда я сбрасываю get_classна объекте $type в приборе Make я вижу, что это Proxies\__CG__\App\Entity\Type, который должен быть правильным?

Редактировать: Моя схема выглядит следующим образом:

vehicle_type:
| code        | varchar(10)  | NO   | PRI | NULL    |       |
| description | varchar(255) | NO   |     | NULL    |       |

make:
| code        | varchar(10)  | NO   | PRI | NULL    |       |
| type        | varchar(10)  | YES  | MUL | NULL    |       |
| description | varchar(255) | NO   |     | NULL    |       |

1 Ответ

0 голосов
/ 18 февраля 2019

Ваш класс VehicleType ожидает только одну марку, а не коллекцию.Вы можете удалить конструктор и убедиться, что он предоставляет только одну сущность, например, используя подсказку типа в методе setter.

В качестве альтернативы вы можете вместо этого изменить отношение между обоими классами на отношение ManyToMany.

...