为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
慕尼黑8549860 2023-10-21 15:44:42
我正在使用 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 
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

首先,您根本不需要 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?)


查看完整回答
反对 回复 2023-10-21
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信