学说 - 复合ID

时间:2016-02-29 23:11:51

标签: php symfony doctrine-orm doctrine

我正在使用symfony2和Doctrine实体,我对下一个有问题:

My DB

我知道我可以解决将ID添加到" club_has_torneo"并把它变成一个实体,但对我来说,创建一个实体看起来就像是不应该做的事情。所以我想知道是否有办法解决这个问题,或者我是否必须做我认为必须做的事。

提前谢谢。

3 个答案:

答案 0 :(得分:2)

我想我会提交自己的两美分。

ORM代表Object Relational Mapper。基本思想是弄清楚如何映射对象而不必过多担心数据库模式。所以你有三个域模型实体:torneo,club和nadador。大。弄清楚您的应用程序将如何使用这些实体。不要担心关系最终会如何存储。

一旦你有一个工作领域模型,那么担心持久性。三个域实体明确映射到三个学说实体。就这些关系而言,我个人并不是复合主键的忠实粉丝。我认为它们只会增加一些价值而使事情复杂化。所以我会让你们两个的Doctrine实体拥有表,并给它们自己的主数据库id。

请注意,这些 Doctrine 实体不是实体。您的应用程序代码根本不需要处理这些关系学说实体。所以在我看来

  

为它创建一个看起来不应该是的东西   完成

不适用于此处。这只是一个持久性细节。

答案 1 :(得分:1)

我认为最好的解决方案确实是为club_has_torneo表创建一个实体。此ClubHasTorneo实体包含club_idtorneo_id as composite keys ,并拥有 多对多<的拥有方您的ClubHasTorneo实体与Nadador实体之间的关系/ em> 。可以使用3个键使用连接表完成此关系。请查看下面的代码,了解如何执行此操作。

您的数据库方案看起来与您绘制的完全一样 您的ClubHasTorneo实体看起来像这样:

<?php

namespace Application\Entity;

use Application\Entity\Club;
use Application\Entity\Torneo;
use Application\Entity\Nadador;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="club_has_torneo")
 */
class ClubHasTorneo
{
    /** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE
     * @var Club
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Application\Entity\Club", inversedBy="clubHasTorneos", cascade={"persist"})
     * @ORM\JoinColumn(name="club_id", referencedColumnName="id")
     */
    protected $club;

    /** MANY-TO-ONE BIDIRECTIONAL, OWNING SIDE
     * @var Torneo
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Application\Entity\Torneo", inversedBy="clubHasTorneos")
     * @ORM\JoinColumn(name="torneo_id", referencedColumnName="id")
     */
    protected $torneo;

    /** MANY-TO-MANY BIDIRECTIONAL, OWNING SIDE
     * @var Collection
     * @ORM\ManyToMany(targetEntity="Application\Entity\Nadador", inversedBy="clubHasTorneos")
     * @ORM\JoinTable(name="club_has_torneo_has_nadador",
     *     joinColumns={
     *         @ORM\JoinColumn(name="club_id", referencedColumnName="club_id"),
     *         @ORM\JoinColumn(name="torneo_id", referencedColumnName="torneo_id")
     *     },
     *     inverseJoinColumns={
     *         @ORM\JoinColumn(name="nadador_id", referencedColumnName="id")
     *     }
     * )
     */
    protected $natadors;

    public function __construct()
    {
        $this->natadors = new ArrayCollection();
    }

    // setters and getters
}

答案 2 :(得分:1)

我的5美分

如果您希望您的实现与绘制的表结构匹配,那么(在我看来)您需要在'club_has_torneo'表中创建一个实体(对于'club_has_torneo_has_matador'您不需要)。

理由是,如果你试图在不创建实体的情况下实现这一点,你需要创建实体关联,以便'natador'表直接引用'club'和'torneo' - 在这种情况下实际数据库关系不再与您绘制的表关系匹配(即,natador与'club_has_torneo'表没有关系)。