猿问

加载 Doctrine 固定装置时,设置引用(外键)存在问题,违反了 -not-null 约束

我正在使用 Doctrine Fixtures 将一些数据加载到我的数据库中,有 3 个不同的表 User、Theme 和 Sous_Theme,最后两个表有外键,Theme 为 (user.id),Sous_Theme 作为两个外键 (user.id)。 id 和主题.id)


我的AppFixtures.php课程的设置方式是每个模型值都已经以这种方式编写:


 private const USERS = [

      [

          'last_name' => 'Goodman',

          'first_name'=> 'Robert',

          'email' => 'robert@foobar.com',

          'job' => 'Admin_Tester',

          'password' => 'blablablablablbal',

          'username' => 'blablablabla',

          'roles' => [USER::ROLE_ADMIN]

      ]...

]




private const THEMES =

    [

        ['name' => 'A theme'],

        ['name' => ' A theme 2']

  .....

]


private const SOUSTHEMES = [

    [

        'name' => 'blablabla',

        'part1' => true, //boolean

        ...

    ],

在编写 SOUSTHEMES 部分之前,我已经加载了用户和主题值及其完美运行的参考:


public function loadTheme(ObjectManager $manager)

    {

        foreach (self::THEMES as $themeDate){

            $theme = new Theme();

            $theme->setName($themeDate['name']);

            $date = new \DateTime();

            $date->modify('-'. rand(0, 10) . 'day');

            $theme->setCreatedAt($date);

            //// Setting user Id into our Theme table.

            $theme->setUser($this->getReference(

                self::USERS[rand(0, count(self::USERS) - 1)]['last_name']));

            $manager->persist($theme);

        }

        $manager->flush();

    }

现在我尝试使用引用 theme.id 和 user.id 加载 sousthemes :


public function loadSousThemes(ObjectManager $manager){

        foreach (self::SOUSTHEMES as $sousthemeData){

            $sousthemes = new SousTheme();

            $sousthemes->setName($sousthemeData['name']);

            $date = new \DateTime();

            $date->modify('-'. rand(0, 10) . 'day');

            $sousthemes->setCreatedAt($date);


我已经开始使用该getReference()方法,但我得到的引用不存在,所以我切换到了addReference()另一个错误,说引用已经存在,我需要使用它setReference()来覆盖它,所以我将我的方法更改为setReference()现在我收到一个错误


SQLSTATE[23502]: Not null violation: 7 ERROR:  null value in column "theme_id" violates not-null constraint 


慕尼黑8549860
浏览 100回答 1
1回答

慕标琳琳

首先,您根本不需要 addReference/getReference,因为您使用一个固定文件。因此,在您的情况下,您只需保存对象并在设置器中使用它们,例如:in loadUsers:public function loadUsers(ObjectManager $manager)    {        foreach (self::USERS as $userData)        {            $user = new User();            ///...            $manager->persist($user);            $this->users[$userData['username']] = $user;        }        $manager->flush();    }and in loadTheme:$theme->setUser($this->users[self::USERS[rand(0, count(self::USERS) - 1)]['username']]);您不需要引用,因为您可以访问对象,当夹具位于单独的文件中时,引用非常有用,因为这样您就无法访问在不同夹具文件中创建的对象。此处描述: https: //symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#sharing-objects- Between-fixtures 。但是假设您想使用引用,我将尝试提供指导来修复您已有的代码。您说通过引用加载用户适用于主题:$theme->setUser($this->getReference(self::USERS[rand(0, count(self::USERS) - 1)]['last_name']));它有效,因为您在以下位置添加了引用loadUsers:$this->addReference($userData['last_name'], $user);因此,在loadUsers您获得这些参考资料后:User objects: - Goodman - ...现在,每当您调用时,$this->getReference('Goodman');您都会获得可以在设置器中使用的 User 对象,例如。设置用户();但您从未调用addReference来loadTheme保存对主题对象的引用。添加addReference到loadTheme:public function loadTheme(ObjectManager $manager)    {        foreach (self::THEMES as $themeDate){            $theme = new Theme();            $theme->setName($themeDate['name']);            // ...            $theme->setUser($this->getReference(                self::USERS[rand(0, count(self::USERS) - 1)]['last_name']));            $manager->persist($theme);            $this->addReference($theme->getName(), $theme);        }        $manager->flush();    }因此,之后loadUsers这些loadThemes参考资料将可用:User objects: - Goodman - ...Theme objects: - A theme - A theme 2 - ...最后在你的loadSousThemes:$sousthemes->setUsername($this->getReference(                self::USERS[rand(0, count(self::USERS) - 1)]['last_name']));            $sousthemes->setTheme($this->getReference(                self::THEMES[rand(0, count(self::THEMES) - 1)]['name']));请注意,我假设这$sousthemes->setUsername()实际上是用于设置 User 对象,而不仅仅是用户名(为什么不称为 setUser?)
随时随地看视频慕课网APP
我要回答