首页 > 解决方案 > 尝试在 Doctrine 固定装置中设置相关对象时出现 ORMInvalidArgumentException

问题描述

我是 Symfony 和 Doctrine 的新手。我有几个不同的实体是相关的,但是当我尝试在 Fixtures 中关联它们时出现异常:

关联字段“App\Entity\Make#$type”的类型“App\Entity\VehicleType”的预期值,
改为“Doctrine\Common\Collections\ArrayCol 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->makeand $this->typenew ArrayCollection()但这是由实体生成器添加的,它似乎是我想要的。

get_class当我在Make 夹具中转储$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    |       |

标签: symfonydoctrinefixtures

解决方案


您的 VehicleType 类只需要一个 Make,而不是 Collection。您可以删除构造函数并确保仅提供单个实体,例如通过在 setter 方法中使用类型提示。

或者,您可能希望将两个类之间的关系改为多对多关系。


推荐阅读