我在我们的项目中有两个使用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(( 方法吗?
User
和UserProfile
实体之间的关系保留在UserProfile::user
属性上,但是,当您调用User::setProfile()
时,您不会设置该属性。
将User::setProfile()
函数更改为以下内容:
function setProfile(UserProfile $profile): self
{
$profile->setUser($this);
$this->profile = $profile;
return $this;
}
您的映射无效。验证您的架构 - 缺少mappedBy
和inversedBy
。修复映射后,这将按预期工作。
在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
。