Symfony数组集合作为实体属性

时间:2015-06-21 02:08:19

标签: php symfony doctrine-orm

有没有办法将ArrayCollection与实体创建的数据库列相关联?

例如,我有两个实体:家庭和宠物类型。

家庭当前有Pet Type的属性,但它需要Pet Type对象,因此目前只能选择一个。

我希望家庭能够拥有多种宠物类型。因此,他们不必在狗或猫之间做出选择,而是可以选择狗和猫。

我尝试过这样做,但是我收到以下错误:

  

捕获致命错误:参数1传递给   Acme \ CoreBundle \ Entity \ Household :: setPetType()必须是。的实例   Acme \ CoreBundle \ Entity \ PetType,实例   给出了Doctrine \ Common \ Collections \ ArrayCollection

我假设我需要在Household实体中更改petType的属性才能与多个宠物类型相关联?

1 个答案:

答案 0 :(得分:2)

根据您的说明,似乎HouseholdPetType的基数为 m-to-one ;这意味着家庭记录只能有PetTypePetType可以与多个Household记录相关联。

从DB的角度来看,这意味着外键进入Household表。如果你想让一个"多个" HouseholdPetType之间的连接,您必须修改实体之间的关系。

只是一个例子(免责声明:您的实体可能会有不同的名称,我也没有对此代码进行测试。我在这里解释一个概念,而不是在运行可运行的代码,因为您的示例并未实现使用代码段示例)

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