原则:模式:更新不创建OneToOne关系


doctrine:schema:update not creating OneToOne relations

当我运行以下命令时: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()了。

invertedBy指的是属性,而不是数据库字段。

inversedBy="user_id"更改为inversedBy="userId"

您还应该根据文档使用JoinColumn,而不是Column和referencedColumnName:

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-到一个单向