doctrine:schema:更新不创建OneToOne关系

时间:2016-05-09 20:57:16

标签: php symfony orm doctrine-orm one-to-one

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

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;

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这里有几个选项,如果你想要双向关联,这意味着你希望能够从其中任何一个访问另一个实体,那么你会想要使用另一个属性(不是{{1}完成这个。类似的东西:

$id

然后在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;

    /**
     * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="userId")
     */
    private $profile;

    ...
}

这样您就可以/** * @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()

如果要将userId用作UserProfile表的主键,则只需要进行更多工作来设置它,您必须在应用程序中明确设置它。更容易在另一个领域引用它。

<强>单向

user.php的

$user->getProfile()

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;

    ...
}

这只允许你/** * @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,如下所示:

$userProfile->getUser()

然后在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;

    /**
     * @ORM\OneToOne(targetEntity="UserProfile", mappedBy="id")
     */
    private $profile;

    ...
}

这样您就可以/** * @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; ... }