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:
这里有几个选项,如果您想要双向关联,这意味着您希望能够从其中任何一个访问另一个实体,那么您将需要使用另一个 属性(不是 $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()
.
当我运行以下命令时: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:
这里有几个选项,如果您想要双向关联,这意味着您希望能够从其中任何一个访问另一个实体,那么您将需要使用另一个 属性(不是 $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()
.