我使用與學說實體Symfony2的,我有下一個問題:主義 - 複合標識
我知道我可以解決這個問題把一個ID爲「club_has_torneo」和車削它變成了一個實體,但對我來說,創建一個實體看起來像是不應該做的事情。所以我想知道是否有辦法解決這個問題,或者如果我必須做我認爲必須做的事。
預先感謝您。
我使用與學說實體Symfony2的,我有下一個問題:主義 - 複合標識
我知道我可以解決這個問題把一個ID爲「club_has_torneo」和車削它變成了一個實體,但對我來說,創建一個實體看起來像是不應該做的事情。所以我想知道是否有辦法解決這個問題,或者如果我必須做我認爲必須做的事。
預先感謝您。
我認爲最好的解決方案的確是爲您的club_has_torneo
表製作一個實體。這ClubHasTorneo
實體有club_id
和torneo_id
as composite keys並持有的擁有方一多到你的很多ClubHasTorneo
實體和Nadador
實體之間關係。這種關係可以通過使用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
}
我5分錢
如果你希望你的實現相匹配的繪製表結構,然後(在我看來),你需要創建一個實體出來的'club_has_torneo'表(對於'club_has_torneo_has_matador'你不需要)。
基本原理是,如果您嘗試在不創建實體的情況下實現此目的,則需要創建實體關聯,以便'natador'表直接引用'club'和'torneo' - 在這種情況下,實際的數據庫關係將不再與您繪製的表格關係匹配(即natador與'club_has_torneo'表格沒有關係)。
我想我會提交我自己的兩美分價值。
ORM代表對象關係映射器。基本思想是找出如何映射對象而不用擔心數據庫模式太多。所以你有三個領域模型實體:torneo,club和nadador。大。弄清楚你的應用程序如何使用這些實體。不要擔心這些關係最終會被儲存起來。
一旦你有一個工作的領域模型,然後擔心持久性。三個領域實體明確地映射到三個學說實體。就這些關係而言,我個人並不喜歡複合主鍵。我認爲他們只是增加了一點價值而使事情複雜化。所以我會爲你的兩個表創建Doctrine實體,並給他們自己的主數據庫ID。
請注意,這些是主義實體不是域實體。你的應用程序代碼根本不需要處理這些關係主義實體。所以,在我看來
創建一個實體看起來喜歡的事,不應該做
在這裏並不適用。這只是一個持久性細節。
我真的會考慮到這一點,謝謝你的建議。 – 8370
我不是數據庫專家,但是您確定這是建立數據庫關係的更好解決方案嗎?我的意思是,這種設計不會爲俱樂部 - 感恩關係添加不必要的重複,當爲一個單一的俱樂部 - 樂隊組合添加多個納塔多行時? – ejuhjav
@ejuhjav這是一對一的,所以你不能在這個解決方案中有多個自然人。如果你想要多個自然人,你需要在ClubHasTorneo和Natador之間多對多。我可以更新我的答案。 – Wilt
@ejuhjav我更新了我的答案 – Wilt