Symfony2实体字段类型查询构建器内部Join

时间:2015-01-17 16:00:51

标签: symfony

我有3个实体(Group,GroupCategory和GroupLanguage)

组表

id(pk)

id_group_category(fk)

GroupCategory表

id(pk)

GroupCategoryLanguage表

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;
}

1 个答案:

答案 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实体中,将调用其中一个,返回的值将显示在您的表单中。

我认为我们很好:)

干杯