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

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

使用來自父實體的生成值

使用來自父實體的生成值

PHP
揚帆大魚 2022-01-14 16:41:43
我的項目中有兩個使用 Doctrine 的實體:class User{    /**     * @ORM\Id     * @ORM\GeneratedValue(strategy="AUTO")     * @ORM\Column(type="integer")     */    private $user_id;    /**     * @ORM\Column(type="string")     */    private $username;    /**     * @ORM\Column(type="string")     */    private $password;    /**     * @ORM\OneToOne(targetEntity="UserProfile", cascade={"persist", "remove"})     * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id", unique=true)     * @var UserProfile     */    private $profile;    //...}class UserProfile{    /**     * @ORM\Id     * @ORM\OneToOne(targetEntity="User")     * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")     */    private $user;    /**     * @ORM\Id     * @ORM\Column(type="integer")     */    private $user_id;    /**     * @ORM\Column(type="string")     */    private $first_name = '';    /**     * @ORM\Column(type="string")     */     private $last_name = '';     //...}我正在嘗試使用以下方法在數據庫中生成新行:$user = new User();$user->setUsername('test');$user->setEmail('[email protected]');$user->setPassword(password_hash('password', PASSWORD_BCRYPT));$em->persist($user);$em->flush();$userProfile = new UserProfile();$userProfile->setFirstName('test');$userProfile->setLastName('user');$user->setProfile($userProfile);$em->persist($user);$em->flush();這似乎與此處的示例相似: https ://www.doctrine-project.org/projects/doctrine-orm/en/2.6/tutorials/composite-primary-keys.html#use-case-2-simple-derived-身份這會引發錯誤:致命錯誤:未捕獲的 Doctrine\ORM\ORMException:App\Entity\UserProfile 類型的實體缺少為字段“用戶”分配的 ID。此實體的標識符生成策略要求在調用 EntityManager#persist() 之前填充 ID 字段。如果您想要自動生成標識符,則需要相應地調整元數據映射。在第 87 行的 /home/site/vendor/doctrine/orm/lib/Doctrine/ORM/ORMException.php如果我添加一個沒有 UserProfile 的用戶,這工作正常,并且我在數據庫中得到一行,其中 user_id 是從 MySQL 自動增量生成的。創建新配置文件時,如何讓 UserProfile 使用新創建的 user_id?我是不是把這個協會的事情復雜化了?我應該只在 UserProfile 上創建一個 setUserId() 方法嗎?
查看完整描述

3 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

User和UserProfile實體之間的關系保留在UserProfile::user屬性上,但是,當您調用 時User::setProfile(),您并沒有設置該屬性。


將您的User::setProfile()功能更改為以下內容:


function setProfile(UserProfile $profile): self

{

    $profile->setUser($this);

    $this->profile = $profile;


    return $this;

}


查看完整回答
反對 回復 2022-01-14
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

您的映射無效。驗證您的架構 - 缺少mappedByinversedBy. 當您修復映射時,這將按預期工作。

在 Symfony 中驗證模式:

bin/console doc:sch:val

在采埃孚:

php public/index.php orm:schema-tool:validate


查看完整回答
反對 回復 2022-01-14
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

他們都為解決方案做出了貢獻。這最終奏效了:


class User

{

    /**

     * @ORM\Id

     * @ORM\GeneratedValue

     * @ORM\Column(type="integer")

     */

    private $user_id;


    /**

     * @ORM\Column(type="string")

     */

    private $username;


    /**

     * @ORM\Column(type="string")

     */

    private $password;


    /**

     * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="user", cascade={"persist", "remove"})

     * @var UserProfile

     */

    private $profile;


    //...


    public function setProfile(UserProfile $profile) : self

    {

        $profile->setUser($this);


        $this->profile = $profile;


        return $this;

    }

}


class UserProfile

{

    /**

     * @ORM\Id

     * @ORM\OneToOne(targetEntity="User", inversedBy="profile")

     * @ORM\JoinColumn(name="user_id", referencedColumnName="user_id")

     */

    private $user;


    /**

     * @ORM\Column(type="string")

     */

    private $first_name = '';


    /**

     * @ORM\Column(type="string")

     */

     private $last_name = '';


     //...

}

這涉及$user_id從UserProfile實體中刪除并向 OneToOne 添加一個 inversedBy 參數。


JoinColumn從實體中刪除User并修復設置器,setProfile()以便它$user在 UserProfile 實體上設置。


查看完整回答
反對 回復 2022-01-14
  • 3 回答
  • 0 關注
  • 176 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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