使用来自父实体的生成值

  • 本文关键字:实体 php doctrine-orm
  • 更新时间 :
  • 英文 :


我在我们的项目中有两个使用Doctrine的实体:

class User
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
private $user_id;
/**
* @ORMColumn(type="string")
*/
private $username;
/**
* @ORMColumn(type="string")
*/
private $password;
/**
* @ORMOneToOne(targetEntity="UserProfile", cascade={"persist", "remove"})
* @ORMJoinColumn(name="user_id", referencedColumnName="user_id", unique=true)
* @var UserProfile
*/
private $profile;
//...
}
class UserProfile
{
/**
* @ORMId
* @ORMOneToOne(targetEntity="User")
* @ORMJoinColumn(name="user_id", referencedColumnName="user_id")
*/
private $user;
/**
* @ORMId
* @ORMColumn(type="integer")
*/
private $user_id;
/**
* @ORMColumn(type="string")
*/
private $first_name = '';
/**
* @ORMColumn(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-identity

这将引发错误:

致命错误:未捕获的学说\ORM\ORMException:类型的实体 应用程序\实体\用户配置文件缺少字段"用户"的分配 ID。这 此实体的标识符生成策略需要 ID 字段 在调用 EntityManager#persist(( 之前填充。如果需要帮助, 自动生成的标识符,而是需要调整 相应的元数据映射。在/home/site/vendor/doctrine/orm/lib/Doctrine/ORM/ORMException.php on 87路

如果我添加没有用户配置文件的用户,这工作正常,我在数据库中得到一行,user_id是从 MySQL 自动增量生成的。如何让用户配置文件在创建新配置文件时使用新创建的user_id?

我是否过度复杂化了协会?我应该在用户配置文件上创建一个 setUserId(( 方法吗?

UserUserProfile实体之间的关系保留在UserProfile::user属性上,但是,当您调用User::setProfile()时,您不会设置该属性。

User::setProfile()函数更改为以下内容:

function setProfile(UserProfile $profile): self
{
$profile->setUser($this);
$this->profile = $profile;
return $this;
}

您的映射无效。验证您的架构 - 缺少mappedByinversedBy。修复映射后,这将按预期工作。

在Symfony中验证模式:

bin/console doc:sch:val

在采埃孚:

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

感谢@emix和@fubar,两者都有助于解决该问题。这是最终起作用的:

class User
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $user_id;
/**
* @ORMColumn(type="string")
*/
private $username;
/**
* @ORMColumn(type="string")
*/
private $password;
/**
* @ORMOneToOne(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
{
/**
* @ORMId
* @ORMOneToOne(targetEntity="User", inversedBy="profile")
* @ORMJoinColumn(name="user_id", referencedColumnName="user_id")
*/
private $user;
/**
* @ORMColumn(type="string")
*/
private $first_name = '';
/**
* @ORMColumn(type="string")
*/
private $last_name = '';
//...
}

这涉及从UserProfile实体中删除$user_id并将 inreverseedBy 参数添加到 OneToOne。

User实体中删除JoinColumn并修复setProfile()的资源库,以便它在用户配置文件实体上设置$user

相关内容

  • 没有找到相关文章

最新更新