Php 原则中的主键/外键关系

Php 原则中的主键/外键关系,php,doctrine,doctrine-orm,Php,Doctrine,Doctrine Orm,在mysql数据库中,我有两个表:“User”和“UserProfile”。表“UserProfile”有一个名为“user\u id”的外键列,该列链接到“user”表的“id”列。现在,当我使用条令从我的db表生成所有实体类时,创建的“UserProfile”类包含一个名为“user”(属于“user”类型)的属性,而不包含任何名为“user\u id”的属性可以吗 现在,如果我想找到一个用户的个人资料,给定用户的id,我需要写以下内容: $user_profile_repo = $this

在mysql数据库中,我有两个表:“User”和“UserProfile”。表“UserProfile”有一个名为“user\u id”的外键列,该列链接到“user”表的“id”列。现在,当我使用条令从我的db表生成所有实体类时,创建的“UserProfile”类包含一个名为“user”(属于“user”类型)的属性,而不包含任何名为“user\u id”的属性可以吗

现在,如果我想找到一个用户的个人资料,给定用户的id,我需要写以下内容:

$user_profile_repo = $this->em->getRepository("UserProfile");

$user_profile = $user_profile_repo->findOneBy(array("user_id"=>$id));
/**
 * models\User
 * @Table(name="User")
 * @Entity
 */
class User
{
    /**
     * @Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @Column(name="name", type="string", length=50, precision=0, scale=0, nullable=false, unique=false)
     */
    private $name;

    /**
     * @OneToOne(targetEntity="models\UserProfile", mappedBy="user")
     */
    private $profile;
}


/**
 * models\UserProfile
 * @Table(name="UserProfile")
 * @Entity
 */
class UserProfile
{
    /**
     * @OneToOne(targetEntity="models\User", inversedBy("profile"))
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
}

但由于生成的实体类不包含“user_id”属性,上述代码将无法工作。现在我需要知道如何调整以使上述代码正常工作?谢谢。

数据库中表/列的实际名称并不重要。您可以在注释中设置它们

应该是这样的:

$user_profile_repo = $this->em->getRepository("UserProfile");

$user_profile = $user_profile_repo->findOneBy(array("user_id"=>$id));
/**
 * models\User
 * @Table(name="User")
 * @Entity
 */
class User
{
    /**
     * @Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @Column(name="name", type="string", length=50, precision=0, scale=0, nullable=false, unique=false)
     */
    private $name;

    /**
     * @OneToOne(targetEntity="models\UserProfile", mappedBy="user")
     */
    private $profile;
}


/**
 * models\UserProfile
 * @Table(name="UserProfile")
 * @Entity
 */
class UserProfile
{
    /**
     * @OneToOne(targetEntity="models\User", inversedBy("profile"))
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
}
在这种情况下,用户具有列id,用户配置文件具有用户id

一旦生成,您应该在用户中获得方法getProfile(),在UserProfile中获得getUser()


它类似于5.7 OneTONE双向:数据库中表/列的实际名称并不重要。您可以在注释中设置它们

应该是这样的:

$user_profile_repo = $this->em->getRepository("UserProfile");

$user_profile = $user_profile_repo->findOneBy(array("user_id"=>$id));
/**
 * models\User
 * @Table(name="User")
 * @Entity
 */
class User
{
    /**
     * @Column(name="id", type="integer", precision=0, scale=0, nullable=false, unique=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @Column(name="name", type="string", length=50, precision=0, scale=0, nullable=false, unique=false)
     */
    private $name;

    /**
     * @OneToOne(targetEntity="models\UserProfile", mappedBy="user")
     */
    private $profile;
}


/**
 * models\UserProfile
 * @Table(name="UserProfile")
 * @Entity
 */
class UserProfile
{
    /**
     * @OneToOne(targetEntity="models\User", inversedBy("profile"))
     * @JoinColumn(name="user_id", referencedColumnName="id")
     */
    private $user;
}
在这种情况下,用户具有列id,用户配置文件具有用户id

一旦生成,您应该在用户中获得方法getProfile(),在UserProfile中获得getUser()


它类似于5.7 oneToOne双向:您应该命名列和关联。我使用docblock。请注意,这是一个一对一i关系,应该在用户配置文件中定义为列。在user类中,您可以添加一个变量并在没有columnWell的情况下定义关联,这是我不想做的。实际上我不想编辑这些类,因为它们是自动生成的。因此,当我可能需要再次生成类时,所有更改都将消失。所以,寻找一些替代方法。我相信有一些…你不需要。您只需添加注释并使用命令行工具为您生成所有内容。我将添加一个带有示例的答案这是一个遗留数据库吗?如果没有,我强烈建议您将其丢弃,从编写/注释实体开始,然后使用orm:schema工具:[创建|更新]。从数据库模式生成d2实体被认为是有害的(至少在我看来是有害的)。@timdev,你为什么这么认为?我认为从sb表生成实体是最快的方法,因为我不必写任何东西。我自己的写作会消耗时间,而且会发生变化而犯错误。请再次提醒我你的意见,以便我能理解并有偏见地这样做。谢谢..你应该命名列和关联。我使用docblock。请注意,这是一个一对一i关系,应该在用户配置文件中定义为列。在user类中,您可以添加一个变量并在没有columnWell的情况下定义关联,这是我不想做的。实际上我不想编辑这些类,因为它们是自动生成的。因此,当我可能需要再次生成类时,所有更改都将消失。所以,寻找一些替代方法。我相信有一些…你不需要。您只需添加注释并使用命令行工具为您生成所有内容。我将添加一个带有示例的答案这是一个遗留数据库吗?如果没有,我强烈建议您将其丢弃,从编写/注释实体开始,然后使用orm:schema工具:[创建|更新]。从数据库模式生成d2实体被认为是有害的(至少在我看来是有害的)。@timdev,你为什么这么认为?我认为从sb表生成实体是最快的方法,因为我不必写任何东西。我自己的写作会消耗时间,而且会发生变化而犯错误。请再次提醒我你的意见,以便我能理解并有偏见地这样做。谢谢你的建议给了我解决这个问题的线索。然而,我确实能够通过在mysql数据库上设置双向主/fireign密钥约束(使其成为一对一)来解决这个问题,然后通过条令生成实体类,从而获得您提到的属性。谢谢你的帮助。:)很乐意帮忙。我还使用模式工具生成/更新mysql表。你的建议给了我解决这个问题的线索。然而,我确实能够通过在mysql数据库上设置双向主/fireign密钥约束(使其成为一对一)来解决这个问题,然后通过条令生成实体类,从而获得您提到的属性。谢谢你的帮助。:)很乐意帮忙。我还使用模式工具生成/更新mysql表。它会创建所有约束