尝试在 Doctrine 装置中设置相关对象时出现 ORMInvalidArgumentException
ORMInvalidArgumentException when trying to set related objects in Doctrine fixtures
我是 Symfony 和 Doctrine 的新手。我有几个不同的相关实体,但是当我尝试在 Fixtures 中关联它们时,出现异常:
Expected value of type "App\Entity\VehicleType" for association field "App\Entity\Make#$type", got "Doctrine\Common\Collections\ArrayColl
ection" instead.
我在第二个固定装置中调用 $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()
s,但这是由实体生成器添加的,这似乎是我想要的。
当我将 get_class
转储到 Make fixture 中的 $type
对象上时,我看到它是一个 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 | |
您的 class VehicleType 需要一个 Make,而不是一个 Collection。您可以删除构造函数并确保只提供一个实体,例如通过在 setter 方法中使用类型提示。
或者,您可能希望将两个 class 之间的关系更改为多对多关系。
我是 Symfony 和 Doctrine 的新手。我有几个不同的相关实体,但是当我尝试在 Fixtures 中关联它们时,出现异常:
Expected value of type "App\Entity\VehicleType" for association field "App\Entity\Make#$type", got "Doctrine\Common\Collections\ArrayColl
ection" instead.
我在第二个固定装置中调用 $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()
s,但这是由实体生成器添加的,这似乎是我想要的。
当我将 get_class
转储到 Make fixture 中的 $type
对象上时,我看到它是一个 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 | |
您的 class VehicleType 需要一个 Make,而不是一个 Collection。您可以删除构造函数并确保只提供一个实体,例如通过在 setter 方法中使用类型提示。
或者,您可能希望将两个 class 之间的关系更改为多对多关系。