在Symfony2窗体的DQL中,当user_type=1且active=TRUE时获取名称



我在两个表之间有一个n:m关系:ServiceTypeUserType,这依赖于第三个表ServiceUserType作为n:m结果。我正在尝试从我的表单生成器中获取user_type=1active=TRUE的所有服务,但这是ServiceUserType表中的列,所以我这样做了:

....
->add('servicio', 'entity', array(
    'class' => 'CommonBundle:ServiceType',
    'property' => 'name',
    'mapped' => FALSE,
    'required' => FALSE,
    'label' => 'test',
    'expanded' => TRUE,
    'multiple' => TRUE,
    'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('ts')
                ->leftJoin('ts.service', 'su')
                ->where('su.user_type = 1')
                ->andWhere('su.active = TRUE');
    }
))
....

但我得到了这个错误:

[语义错误]第0行,第81列,靠近"su WHERE su.user_type":错误:Class CommonBundle\Entity\ServiceType没有命名为服务的关联

我不知道我做错了什么,有什么帮助吗?这是ServiceType实体:

    class ServiceType
    {
        protected $id;
        protected $name;
        protected $active = true;
        ...
    }

另一个是ServiceUserType:

class ServiceUserType
{
    /**
     * @ORMId
     * @ORMManyToOne(targetEntity="CommonBundleEntityServiceType")
     * @ORMJoinColumn(name="service_id", referencedColumnName="id")
     */
    protected $service;
    /**
     * @ORMId
     * @ORMManyToOne(targetEntity="CommonBundleEntityUserType")
     * @ORMJoinColumn(name="user_type_id", referencedColumnName="id")
     */
    protected $user_type;
    /**
     * @ORMColumn(name="active", type="boolean", nullable=true)
     */
    protected $active = true;
    ...
}

我做错了什么?

servicio表单字段的类是ServiceType,当您查询时,它将选择ServiceType实体作为根。ServiceType没有名为service的字段,ServiceUserTypes有。您可以将以下属性添加到您的ServiceType实体中:

/**
 *@ORMOneToMany(targetEntity="CommonBundleEntityServiceUserType", mappedBy="service")
*/
protected $serviceUserTypes;

然后更改您的查询:

'query_builder' => function(EntityRepository $er) {
        return $er->createQueryBuilder('ts')
                ->leftJoin('ts.serviceUserTypes', 'su')
                ->where('su.user_type = 1')
                ->andWhere('su.active = TRUE');
    }

不要忘记在ServiceUserType类的属性服务上添加invertedBy选项,并在ServiceType类的构造函数上将属性$serviceUserTypes设置为新的ArrayCollection。

最新更新