doctrine:schema:update 未创建一对一关系

doctrine:schema:update not creating OneToOne relations

当我运行以下命令时:php app/console doctrine:schema:update --force --dump-sql

它returns这条消息:Nothing to update - your database is already in sync with the current entity metadata

我有两个实体,User 和 UserProfile。

User.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

User.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;

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

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

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

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-one-unidirectional

这里有几个选项,如果您想要双向关联,这意味着您希望能够从其中任何一个访问另一个实体,那么您将需要使用另一个 属性(不是 $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 table 的主键,您可以只需要做更多的工作来设置它,并且您必须在您的应用程序中明确设置它。更容易在另一个领域引用它。

单向

User.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().