当我运行以下命令时:php app/console doctrine:schema:update --force --dump-sql
它返回以下消息:Nothing to update - your database is already in sync with the current entity metadata
。
我有两个实体,User和UserProfile。
用户.php
/**
* @ORM'Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
* @ORM'OneToOne(targetEntity="UserProfile", inversedBy="user_id")
*/
private $id;
...
UserProfile.php
/**
* @ORM'Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM'Id
* @ORM'Column(name="user_id", type="integer")
* @ORM'OneToOne(targetEntity="User", mappedBy="id")
*/
private $userId;
...
我已经尝试清除缓存了。
更新#1
用户.php
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
* @ORM'OneToOne(targetEntity="UserProfile", mappedBy="userId")
*/
private $id;
UserProfile.php
/**
* @ORM'Id
* @ORM'Column(name="user_id", type="integer")
* @ORM'OneToOne(targetEntity="User", inversedBy="id")
* @ORM'JoinColumn(name="user_id", referencedColumnName="id")
*/
private $userId;
这里有几个选项,如果您想要双向关联,也就是说您希望能够从其中任何一个访问另一个实体,那么您将希望使用另一个属性(而不是$id
)来实现这一点。类似于:
/**
* @ORM'Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM'OneToOne(targetEntity="UserProfile", mappedBy="userId")
*/
private $profile;
...
}
然后在UserProfile.php 中
/**
* @ORM'Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM'OneToOne(targetEntity="User", inversedBy="profile")
* @ORM'JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;
...
}
这将允许您执行$userProfile->getUser()
和$user->getProfile()
。
如果你想使用userId作为UserProfile表的主键,你可以只需要更多的工作来设置它,并且你必须在你的应用程序中显式地设置它。在另一个字段中引用它更容易。
单向
用户.php
/**
* @ORM'Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
UserProfile.php
/**
* @ORM'Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM'OneToOne(targetEntity="User", inversedBy="profile")
* @ORM'JoinColumn(name="userId", referencedColumnName="id")
*/
private $user;
...
}
这将只允许您执行$userProfile->getUser()
。可能不是你想要的。另一个单向解决方案是从用户对象到UserProfile,如下所示:
/**
* @ORM'Table(name="users", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM'OneToOne(targetEntity="UserProfile", mappedBy="id")
*/
private $profile;
...
}
然后在UserProfile.php 中
/**
* @ORM'Table(name="users_profiles", options={"charset":"utf8mb4", "collate":"utf8mb4_unicode_ci"})
* @ORM'Entity(repositoryClass="AppBundle'Repository'UserProfileRepository")
*/
class UserProfile
{
/**
* @ORM'Id
* @ORM'Column(name="id", type="integer")
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
...
}
这样你就可以做$user->getProfile()
了。
将inversedBy="user_id"
更改为inversedBy="userId"
您还应该根据文档使用JoinColumn,而不是Column和referencedColumnName:
http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-到一个单向