教义复合键

时间:2013-05-27 19:21:18

标签: php symfony doctrine

我有这3个表

“业务”包含以下字段:Id,Name等。 “城市”包含以下字段:Id,Name等。

然后我有一个名为BusinessCity的表(假设商务可以与许多城市相关)。此表包含“BusinessId”和“CityId”字段。

我试图将CityId与City实体相关联,并将BusinessId与BusinessCity类关联到业务实体。我一直在谷歌上搜索这个过去3天并且无法找到答案,如果有人问我之前我很抱歉没有看到它。任何人都可以帮助我或给我一些关于如何完成这一任务的指示。提前致谢

2 个答案:

答案 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关联直接关联。