亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

加載 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' => '[email protected]',          '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 關注
  • 134 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號