2017-05-14 64 views
2

在我的symfony應用程序中,我使用嵌入式表單。在我的情況下,一個對象「CompetenceGroupe」可以有多個對象「CompetenceItem」,但一個對象「CompetenceItem」只屬於一個對象「CompetenceGroupe」,所以關係是manyToOne。嵌入表單關係原則

表格工作完美,我有兩個表(每個實體一個表),它很好地保存在數據庫中。

但是當我在控制器中選擇一個CompetenceGroupe對象時,我擁有該對象的所有信息,並且他有一個空的「competenceItems」屬性,所以我無法檢索childs對象(CompetenceItem)。

我的 「CompetenceGroupe」 實體:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="competences_groupes") 
*/ 
class CompetenceGroupe 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id_competence_groupe; 

/** 
* @var User $user 
* 
* @ORM\ManyToOne(targetEntity="User", cascade={"persist", "merge"}) 
* @ORM\JoinColumn(name="id_user", referencedColumnName="id_user", nullable=false) 
*/ 
private $user; 

/** 
* @ORM\Column(type="string", length=60, nullable=true) 
*/ 
protected $titre; 

protected $competence_items; 

public function __construct() 
{ 
    $this->competence_items = new ArrayCollection(); 
} 

public function getCompetenceItems() 
{ 
    return $this->competence_items; 
} 

/** 
* Get idCompetenceGroupe 
* 
* @return integer 
*/ 
public function getIdCompetenceGroupe() 
{ 
    return $this->id_competence_groupe; 
} 

/** 
* Set titre 
* 
* @param string $titre 
* 
* @return CompetenceGroupe 
*/ 
public function setTitre($titre) 
{ 
    $this->titre = $titre; 

    return $this; 
} 

/** 
* Get titre 
* 
* @return string 
*/ 
public function getTitre() 
{ 
    return $this->titre; 
} 

/** 
* Set user 
* 
* @param \AppBundle\Entity\User $user 
* 
* @return CompetenceGroupe 
*/ 
public function setUser(\AppBundle\Entity\User $user) 
{ 
    $this->user = $user; 

    return $this; 
} 

/** 
* Get user 
* 
* @return \AppBundle\Entity\User 
*/ 
public function getUser() 
{ 
    return $this->user; 
} 

public function addItem(CompetenceItem $item) 
{ 
    $this->competence_items->add($item); 
} 

public function removeItem(CompetenceItem $item) 
{ 
    // ... 
} 

/** 
* Set competenceItems 
* 
* @param \AppBundle\Entity\CompetenceItem $competenceItems 
* 
* @return CompetenceGroupe 
*/ 
public function setCompetenceItems(\AppBundle\Entity\CompetenceItem $competenceItems = null) 
{ 
    $this->competence_items = $competenceItems; 

    return $this; 
} 
} 

而我的 「CompetenceItem」 實體:

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* @ORM\Entity 
* @ORM\Table(name="competences_items") 
*/ 
class CompetenceItem 
{ 
/** 
* @ORM\Id 
* @ORM\Column(type="integer") 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id_competence_item; 

/** 
* @ORM\Column(type="string", length=60, nullable=false) 
*/ 
protected $libelle; 

/** 
* @var CompetenceNiveau $niveau 
* 
* @ORM\ManyToOne(targetEntity="CompetenceNiveau", cascade={"persist", "merge"}) 
* @ORM\JoinColumn(name="id_competence_niveau", referencedColumnName="id_competence_niveau", nullable=true) 
*/ 
private $niveau; 

/** 
* @var CompetenceGroupe $competence_groupe 
* 
* @ORM\ManyToOne(targetEntity="CompetenceGroupe", cascade={"persist", "merge"}) 
* @ORM\JoinColumn(name="id_competence_groupe", referencedColumnName="id_competence_groupe", nullable=false) 
*/ 
private $competence_groupe; 

/** 
* Get idCompetenceItem 
* 
* @return integer 
*/ 
public function getIdCompetenceItem() 
{ 
    return $this->id_competence_item; 
} 

/** 
* Set libelle 
* 
* @param string $libelle 
* 
* @return CompetenceItem 
*/ 
public function setLibelle($libelle) 
{ 
    $this->libelle = $libelle; 

    return $this; 
} 

/** 
* Get libelle 
* 
* @return string 
*/ 
public function getLibelle() 
{ 
    return $this->libelle; 
} 

/** 
* Set niveau 
* 
* @param \AppBundle\Entity\CompetenceNiveau $niveau 
* 
* @return CompetenceItem 
*/ 
public function setNiveau(\AppBundle\Entity\CompetenceNiveau $niveau = null) 
{ 
    $this->niveau = $niveau; 

    return $this; 
} 

/** 
* Get niveau 
* 
* @return \AppBundle\Entity\CompetenceNiveau 
*/ 
public function getNiveau() 
{ 
    return $this->niveau; 
} 

/** 
* Set competenceGroupe 
* 
* @param \AppBundle\Entity\CompetenceGroupe $competenceGroupe 
* 
* @return CompetenceItem 
*/ 
public function setCompetenceGroupe(\AppBundle\Entity\CompetenceGroupe $competenceGroupe) 
{ 
    $this->competence_groupe = $competenceGroupe; 

    return $this; 
} 

/** 
* Get competenceGroupe 
* 
* @return \AppBundle\Entity\CompetenceGroupe 
*/ 
public function getCompetenceGroupe() 
{ 
    return $this->competence_groupe; 
} 
} 

我覺得我有 「competence_items」 屬性在CompetenceGroupe實體缺少註釋,但我真的不確定...

感謝您的幫助!

+0

你在定義他的關係時遇到了問題,首先他需要修復它 – ahmedbhs

+1

同意,我已經更新了我的答案。與您的類似,但原始問題描述了來自CompetenceGroupe實體的OneToMany關係,而不是ManyToOne。這意味着他需要你描述的雙向關係。 – ehymel

回答

0

好的做法可能是有競爭力的形式,這將你的能力組的形式內部調用

您可以添加一個CollectionType作爲parrent,包括查詢,搜索的能力已經存在

有在symfony中演示博客與post form type一些很好的例子

或者你可以使用form events(的onsubmit,preSubmit,等...)到你的實體與能力要求充電。這個例子展示了一個允許從預設數據中選擇朋友的消息表單,這是一個很好的例子。

0

編輯:如果一個能力團隊可以有許多能力項目,那麼這是一個多對多的關係;這是教義定義的關係的反面,但這沒關係。你的問題問如何拉一個能力集團並檢索所有相關能力項目。您可以通過在您的CompetenceGroupe實體中將capabilitiesItems設置爲ArrayCollection來完成此操作,就像您所做的一樣。您必須在註釋中進一步定義,請參閱下面的(更新)代碼。

對於ArrayCollection,你可以刪除你的方法setCompetenceItems,而是在你的CompetenceGroupe實體定義一個方法addCompetenceItem

class CompetenceGroupe 
{ 
    /** 
    * @ORM\OneToMany(targetEntity="CompetenceItem", mappedBy="competence_groupe") 
    */ 
    protected $competenceItems; 

    public function __construct() 
    { 
     $this->competenceItems= new ArrayCollection(); 
    } 

    /** 
    * Add competenceItem 
    * 
    * @param CompetenceItem $competenceItem 
    * @return CompetenceGroupe 
    */ 
    public function addCompetenceItem(CompetenceItem $competenceItem) 
    { 
     $this->competence_items->add($competenceItem); 

     return $this; 
    } 
} 

您還需要定義擁有方纔能使所有這些工作。

+0

他在定義他的關係時遇到了問題,首先他需要修復它,以及談論添加方法 – ahmedbhs

0

你拖的選擇,甚至創造一個Many-To-One, Unidirectional,在這種情況下,你需要清理一些代碼,我們來看一看:
在CompetenceGroupe類:

class CompetenceGroupe 
{ 

/** 
* Many competence have One Group. 
* @ManyToOne(targetEntity="CompetenceItem") 
* @JoinColumn(name="id_competence_item", referencedColumnName="id_competence_item") 
*/ 
protected $competence_items; 

public function __construct() 
{ 
    // $this->competence_items = new ArrayCollection(); 
//delete that line 
} 

在CompetenceItem類:

class CompetenceItem 
{ 

您需要刪除private $competence_groupe;屬性與他的註解:

通過這種方式,當你轉儲一個CompetenceGroupe對象,你會找到能力項目。

另外,如果您想從反面和擁有面獲取數據,您可以使用One-To-Many, Bidirectional