2017-05-14 5 views
2

임베디드 폼을 사용하고 있습니다. 필자의 경우, "CompetenceGroupe"객체는 "CompetenceItem"이라는 객체를 여러 개 가질 수 있지만 "CompetenceItem"객체는 하나의 "CompetenceGroupe"객체에만 속합니다. 따라서 관계는 manyToOne입니다.내 symfony 앱에서 임베디드 폼 관계 doctrine

양식이 완벽하게 작동하며 두 개의 표 (각 항목마다 하나씩)가 있으며 데이터베이스에 잘 저장되어 있습니다.

하지만 내 컨트롤러에서 doctrine을 사용하여 CompetenceGroupe 개체를 선택하면 해당 개체의 모든 정보가 있고 빈 "competenceItems"속성이있어 하위 개체 (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; 
} 
} 

나는 내가 CompetenceGroupe 엔티티에서 "competence_items"재산의 누락 된 주석을 가지고 있다고 생각하지만, 나는 정말로 모르겠다. ...

당신의 도움에 감사드립니다!

+0

자신의 관계를 정의하는 데 문제가 있습니다. 먼저 수정해야합니다. – ahmedbhs

+1

동의합니다. 답변을 업데이트했습니다. 당신과 비슷하지만 원래의 질문은 CompetenceGroupe 엔티티의 ManyToOne이 아닌 OneToMany 관계를 설명했습니다. 이것은 당신이 묘사 한 양방향 관계가 필요하다는 것을 의미합니다. – ehymel

답변

0

좋은 방법은

당신은 parrent로 CollectionType을 추가 할 수 있습니다 당신의 능력 그룹 형태로 내부에 전화를 할 것 역량 형태를 가지고 이미

있다 존재하는 역량 검색 쿼리를 포함 할 수 있습니다 symfony 데모 블로그에서 post form type을 사용한 좋은 예

또는 form events (onSubmit, preSubmit 등)을 사용하여 필요한 역량으로 엔티티를 충전 할 수 있습니다. 이 예는 프리셋 데이터에서 친구를 선택할 수있는 메시지 양식을 보여줍니다. 이는 좋은 예입니다.

0

편집 : 하나의 competenceGroupe에 많은 competenceItem이있을 수 있으면 OneToMany 관계입니다. 이것은 doctrine이 정의한 관계의 반대면이지만 괜찮습니다. 귀하의 질문에 competenceGroupe을 가져 와서 관련된 모든 competence 항목을 검색하는 방법이 있습니다. 당신이했던 것처럼 CompetenceItems를 CompetenceGroupe 엔티티의 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

그는 자신의 관계를 정의하는 데 문제가 있습니다. 먼저 add 메서드에 대한 befaure 문제를 해결해야합니다. – 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으로 할 수 있습니다.