有没有办法将ArrayCollection与实体创建的数据库列相关联?
例如,我有两个实体:家庭和宠物类型。
家庭当前有Pet Type的属性,但它需要Pet Type对象,因此目前只能选择一个。
我希望家庭能够拥有多种宠物类型。因此,他们不必在狗或猫之间做出选择,而是可以选择狗和猫。
我尝试过这样做,但是我收到以下错误:
捕获致命错误:参数1传递给 Acme \ CoreBundle \ Entity \ Household :: setPetType()必须是。的实例 Acme \ CoreBundle \ Entity \ PetType,实例 给出了Doctrine \ Common \ Collections \ ArrayCollection
我假设我需要在Household实体中更改petType的属性才能与多个宠物类型相关联?
答案 0 :(得分:2)
根据您的说明,似乎Household
和PetType
的基数为 m-to-one ;这意味着家庭记录只能有PetType
而PetType
可以与多个Household
记录相关联。
从DB的角度来看,这意味着外键进入Household
表。如果你想让一个"多个" Household
和PetType
之间的连接,您必须修改实体之间的关系。
只是一个例子(免责声明:您的实体可能会有不同的名称,我也没有对此代码进行测试。我在这里解释一个概念,而不是在运行可运行的代码,因为您的示例并未实现使用代码段示例)
class Household
{
//some properties
/**
* @ORM\ManyToMany(targetEntity="PetType", inversedBy="households")
* @ORM\JoinTable(name="household_pettype")
*/
$pet_types;
//some methods
public function addPetType(PetType $petType)
{
$this->pet_types[] = $petType;
return $this;
}
public function setPetTypes(ArrayCollection $petTypes)
{
$this->pet_types = $petTypes;
return $this;
}
public function removePetType(PetType $petType)
{
$this->pet_types->removeElement($petType);
}
public function getPetTypes()
{
return $this->pet_types;
}
}
class PetType
{
//some properties
/**
* @ORM\ManyToMany(targetEntity="Household", mappedBy="pet_types")
*/
$households;
//some methods
public function addHousehold(Household $household)
{
$this->households[] = $household;
return $this;
}
public function setHouseholds(ArrayCollection $households)
{
$this->households = $households;
return $this;
}
public function removeHousehold(Household $household)
{
$this->households->removeElement($household);
}
public function getHousehold()
{
return $this->households;
}
}
之后你需要再次运行
php app/consolle doctrine:schema:update --force
这将更新您的数据库架构,并且由于新基数是 m-to-n ,因此将创建一个名为household_pettype
的关系表(仅保存来自其他两个的外键)表)
之后你可以选择使用两种方法(从家庭的角度来看)
->addPetType($petType);
将附加PetType
个对象
Household
集合->setPetTypes($petTypeArrayCollection);
将全部投入
PetTypes