あなたが達成しようとしているのは、 joinTableとの双方向の多対多の関係です。
多くの企業は複数の都市に存在する可能性があり、1 つの都市に複数の企業が存在する可能性があります。
多対多の関係では、どちらの側も所有側になることができます。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 ..
市区町村(逆側 = mappingBy )
/**
* @ORM\ManyToMany(targetEntity="Your/Bundle/Business", mappedBy="cities")
*/
protected $businesses;
// getters & setters ...
// other properties and methods ...