我有这3个表
“业务”包含以下字段:Id,Name等。 “城市”包含以下字段:Id,Name等。
然后我有一个名为BusinessCity的表(假设商务可以与许多城市相关)。此表包含“BusinessId”和“CityId”字段。
我试图将CityId与City实体相关联,并将BusinessId与BusinessCity类关联到业务实体。我一直在谷歌上搜索这个过去3天并且无法找到答案,如果有人问我之前我很抱歉没有看到它。任何人都可以帮助我或给我一些关于如何完成这一任务的指示。提前致谢
答案 0 :(得分:2)
您要实现的目标是与 joinTable 的双向多对多关系。
许多企业可以居住在多个城市,在一个城市可以有多个企业。
在多对多关系中,任何一方都可以是拥有方。 JoinTable定义可以省略并且具有合理的默认值,但是如果你想具体地指定它,我将它包含在示例中。
商家(在此示例中:拥有side = inversedBy = JoinTable定义)
/**
* @ORM\ManyToMany(targetEntity="Your/Bundle/City", inversedBy="businesses",cascade="{persist,merge}" fetch="EAGER")
* @ORM\JoinTable(name="BusinessCity",
* joinColumns={@JoinColumn(name="business_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="city_id", referencedColumnName="id")}
* )
*/
protected $cities;
public function __construct()
{
$this->cities = new ArrayCollection();
}
public function getCities()
{
return $this->cities;
}
public function setCities(Collection $cities)
{
// using map with closure to have dublicate/type-checking provided by addCity
$this->cities->map(function($city) {
$this->addCity($city);
});
return $this;
}
public function addCity(CityInterface $city)
{
// ... you don't want dublicates in your collection
if (!$this->cities->contains($city)) {
$this->cities->add($city);
}
return $this;
}
public function removeCity(CityInterface $city)
{
$this->cities->removeElement($city);
return $this;
}
// other properties and methods ..
城市(反面= mappedBy )
/**
* @ORM\ManyToMany(targetEntity="Your/Bundle/Business", mappedBy="cities")
*/
protected $businesses;
// getters & setters ...
// other properties and methods ...
答案 1 :(得分:1)
这实际上非常简单,您所要做的就是定义您的JoinTable。在文档中找到它并不容易,但Composite Primary Keys部分中有一个示例。
简而言之,您所要做的就是将oneToMany / manyToOne关联与表示JoinTable的类相关联,而不是将Business和City与ManyToMany关联直接关联。