我正在使用symfony2和Doctrine实体,我对下一个有问题:
我知道我可以解决将ID添加到" club_has_torneo"并把它变成一个实体,但对我来说,创建一个实体看起来就像是不应该做的事情。所以我想知道是否有办法解决这个问题,或者我是否必须做我认为必须做的事。
提前谢谢。
答案 0 :(得分:2)
我想我会提交自己的两美分。
ORM代表Object Relational Mapper。基本思想是弄清楚如何映射对象而不必过多担心数据库模式。所以你有三个域模型实体:torneo,club和nadador。大。弄清楚您的应用程序将如何使用这些实体。不要担心关系最终会如何存储。
一旦你有一个工作领域模型,那么担心持久性。三个域实体明确映射到三个学说实体。就这些关系而言,我个人并不是复合主键的忠实粉丝。我认为它们只会增加一些价值而使事情复杂化。所以我会让你们两个的Doctrine实体拥有表,并给它们自己的主数据库id。
请注意,这些 Doctrine 实体不是域实体。您的应用程序代码根本不需要处理这些关系学说实体。所以在我看来
为它创建一个看起来不应该是的东西 完成
不适用于此处。这只是一个持久性细节。
答案 1 :(得分:1)
我认为最好的解决方案确实是为club_has_torneo
表创建一个实体。此ClubHasTorneo
实体包含club_id
和torneo_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'表没有关系)。