0

我有这 3 张桌子

带有这些字段的“业务”:Id、Name 等。带有这些字段的“City”:Id、Name 等。

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

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

4

2 回答 2

2

您要实现的是与joinTable的双向多对多关系。

许多企业可以居住在多个城市,一个城市可以有多个企业。

在多对多关系中,任何一方都可以是拥有方。JoinTable 定义可以省略并具有合理的默认值,但如果您想具体指定它,我将其包含在示例中。

业务(在此示例中:拥有方 = 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 ...
于 2013-05-27T20:31:40.793 回答
1

这实际上很简单,您所要做的就是定义您的 JoinTable。在文档中不容易找到,但在Composite Primary Keys部分中有一个示例。

简而言之,您所要做的就是将 oneToMany/manyToOne-associations 与表示您的 JoinTable 的类一起使用,而不是直接将 Business 和 City 与 ManyToMany-associations 相关联。

于 2013-05-27T20:01:50.593 回答