嵌入式形式关系学说



在我的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;
    }
}

您还需要定义拥有方以使所有这些工作。

最新更新