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

使用来自父实体的生成值

使用来自父实体的生成值

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('test@example.com');$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 关注
  • 235 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号