我有3个实体(Group,GroupCategory和GroupLanguage)
id(pk)
id_group_category(fk)
id(pk)
id(pk)
id_language(fk)
id_group_category(fk)
我创建了一个GroupType,它将GroupCategory作为子表单。
$builder->add('id_group_category', 'entity', array(
'class' => 'BazaarBundle:GroupCategory',
'property' => 'id',
'query_builder' => function(EntityRepository $a) {
return $a->createQueryBuilder('a')
->innerJoin('BazaarBundle:GroupCategoryLanguage', 'b')
->where('b.id_group_category = a.id')
->orderBy('a.id', 'ASC');
}
)
)
->add('Add', 'submit');
我正在尝试内部加入语言表,以便下拉列表中将填充文本而不是类别的ID。
我对Symfony2很新,并且已经查阅了他们的文档,很遗憾地说这对我来说非常令人费解。我做得对,因为我在代码中遇到了一些错误。
错误消息:
[语义错误]第0行,第111行'id_group_category'附近:错误:类Karl \ BazaarBundle \ Entity \ GroupCategoryLanguage没有名为id_group_category的字段或关联
GroupCategory.php
class GroupCategory
{
public function __construct()
{
$this->groupCategoryLanguage = new ArrayCollection();
}
public function __toString(){
return $this->groupCategoryLanguage->getName();
}
/**
* @ORM\OneToMany(targetEntity="GroupCategoryLanguage", mappedBy="idGroupCategory")
* @ORM\JoinColumn(nullable=false,referencedColumnName="id_group_category")
*/
protected $groupCategoryLanguage;
}
GroupCategoryLanguage.php
class GroupCategoryLanguage
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var integer
*
* @ORM\Column(name="id_language", type="integer")
*/
private $idLanguage;
/**
* @var integer
*
* @ORM\JoinColumn(name="id_group_category", nullable=false)
* @ORM\ManyToOne(targetEntity="Karl\BazaarBundle\Entity\GroupCategory", inversedBy="groupCategoryLanguage")
*/
private $idGroupCategory;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=32)
*/
private $name;
}
答案 0 :(得分:1)
我认为您需要通过添加:
将GroupCategoryLanguage数据添加到您的查询中->addSelect('b')
到你的查询builer对象。 例如下面。
请注意我已经删除了where条件,因为它似乎是一个连接条件,并且这不是必需的,因为Doctrine可以了解关于关系的所有信息。如果我错了,不要删除它......
$builder->add('id_group_category', 'entity', array(
'class' => 'BazaarBundle:GroupCategory',
'property' => 'id',
'query_builder' => function(EntityRepository $a) {
return $a->createQueryBuilder('a')
->innerJoin('a.languages', 'b')
->addSelect('b')
->orderBy('a.id', 'ASC');
}
))
->add('Add', 'submit');
编辑:
关于我们的讨论,我更新了我的答案:。
让我们从头开始:
GroupCategory与GroupCategoryLanguage之间存在关联,GroupCategoryLanguage是此关系的所有者(必须为FK)。 在这里,您希望从GroupCategory获取语言,因此它是$ owner-> getSlave(),您需要双向关系。
为此,您需要在从属实体中添加一个字段:
所以在GroupCategory实体中:
/**
* @ORM\OneToMany(targetEntity="Karl\BazaarBundle\Entity\GroupCategoryLanguage",referencedColumnName="id_group_category", mappedBy="category")
* @ORM\JoinColumn(nullable=false)
*/
private $languages;
我假设你在GroupCategoryLanguages中有:
/**
* @ORM\ManyToOne(targetEntity="Karl\BazaarBundle\Entity\GroupCategory", inversedBy="languages")
* @ORM\JoinColumn(name="id_group_category", nullable=false)
*/
private $category;
我认为你的一个问题是你从表中思考,我错了吗? 你真的需要考虑对象(实体),让Doctrine管理无聊的东西:)
显示语言代替ID
您可以完全删除'property'选项并将__toString方法添加到GroupCategory实体中,将调用其中一个,返回的值将显示在您的表单中。
我认为我们很好:)
干杯