在我的symfony应用程序中,我正在使用嵌入式表单。在我的例子中,一个对象"CompetenceGroupe"可以有多个对象"CompetenceItem",但一个对象"CompetenceItem"只属于一个对象"CompetenceGroupe",所以关系是manyToOne。
表单运行良好,我有两个表(每个实体一个(,并且很好地保存在数据库中。
但是当我在我的控制器中选择一个带有教义的 CompetenceGroupe 对象时,我拥有该对象的所有信息,并且他有一个空的"competenceItems"属性,所以我无法检索子对象(CompetenceItem(。
我的"能力组"实体:
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
use DoctrineCommonCollectionsArrayCollection;
/**
* @ORMEntity
* @ORMTable(name="competences_groupes")
*/
class CompetenceGroupe
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id_competence_groupe;
/**
* @var User $user
*
* @ORMManyToOne(targetEntity="User", cascade={"persist", "merge"})
* @ORMJoinColumn(name="id_user", referencedColumnName="id_user", nullable=false)
*/
private $user;
/**
* @ORMColumn(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 AppBundleEntityUser $user
*
* @return CompetenceGroupe
*/
public function setUser(AppBundleEntityUser $user)
{
$this->user = $user;
return $this;
}
/**
* Get user
*
* @return AppBundleEntityUser
*/
public function getUser()
{
return $this->user;
}
public function addItem(CompetenceItem $item)
{
$this->competence_items->add($item);
}
public function removeItem(CompetenceItem $item)
{
// ...
}
/**
* Set competenceItems
*
* @param AppBundleEntityCompetenceItem $competenceItems
*
* @return CompetenceGroupe
*/
public function setCompetenceItems(AppBundleEntityCompetenceItem $competenceItems = null)
{
$this->competence_items = $competenceItems;
return $this;
}
}
和我的"能力项"实体:
namespace AppBundleEntity;
use DoctrineORMMapping as ORM;
use SymfonyComponentValidatorConstraints as Assert;
use DoctrineCommonCollectionsArrayCollection;
/**
* @ORMEntity
* @ORMTable(name="competences_items")
*/
class CompetenceItem
{
/**
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id_competence_item;
/**
* @ORMColumn(type="string", length=60, nullable=false)
*/
protected $libelle;
/**
* @var CompetenceNiveau $niveau
*
* @ORMManyToOne(targetEntity="CompetenceNiveau", cascade={"persist", "merge"})
* @ORMJoinColumn(name="id_competence_niveau", referencedColumnName="id_competence_niveau", nullable=true)
*/
private $niveau;
/**
* @var CompetenceGroupe $competence_groupe
*
* @ORMManyToOne(targetEntity="CompetenceGroupe", cascade={"persist", "merge"})
* @ORMJoinColumn(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 AppBundleEntityCompetenceNiveau $niveau
*
* @return CompetenceItem
*/
public function setNiveau(AppBundleEntityCompetenceNiveau $niveau = null)
{
$this->niveau = $niveau;
return $this;
}
/**
* Get niveau
*
* @return AppBundleEntityCompetenceNiveau
*/
public function getNiveau()
{
return $this->niveau;
}
/**
* Set competenceGroupe
*
* @param AppBundleEntityCompetenceGroupe $competenceGroupe
*
* @return CompetenceItem
*/
public function setCompetenceGroupe(AppBundleEntityCompetenceGroupe $competenceGroupe)
{
$this->competence_groupe = $competenceGroupe;
return $this;
}
/**
* Get competenceGroupe
*
* @return AppBundleEntityCompetenceGroupe
*/
public function getCompetenceGroupe()
{
return $this->competence_groupe;
}
}
我想我在 CompetenceGroupe 实体中缺少"competence_items"属性的注释,但我真的不确定......
感谢您的帮助!
一个好的做法可能是有一个能力表格,它会在你的能力组表格中调用
您可以添加 CollectionType 作为 parrent 并包含查询以搜索已存在的能力
在symfony演示博客中有一些关于帖子表单类型的很好的例子
或者,您可以使用表单事件(提交、预提交等(向您的实体收取所需的能力。此示例显示了一个消息表单,该表单允许从预设数据中选择朋友,这是一个很好的示例。
你有拖曳选择,甚至要创建一个多对一的、单向的,在这种情况下,你需要清理一些代码,看看:
在能力组类中:
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
}
在能力项目类中:
class CompetenceItem
{
您需要删除带有注释private $competence_groupe;
属性:
这样,当您转储能力组对象时,您将找到能力项。
另外,如果您想从反向和拥有侧获取数据,您可以使用一对多,双向来做到这一点。
编辑:如果一个能力组可以有很多能力项目,那么这就是一对多关系;这是教义所定义的关系的反面,但这没关系。您的问题询问了如何提取能力组并检索所有相关的能力项。您可以通过在 CompetenceGroupe 实体中将 competenceItems 设为 ArrayCollection 来做到这一点,就像您所做的那样。您必须在注释中进一步定义它,请参阅下面的(更新(代码。
对于ArrayCollection
,您可以删除方法setCompetenceItems
,改为定义CompetenceGroupe
实体中addCompetenceItem
的方法。
class CompetenceGroupe
{
/**
* @ORMOneToMany(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;
}
}
您还需要定义拥有方以使所有这些工作。