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

时间:2014-08-30 02:05:37

标签: symfony doctrine-orm doctrine dql

我在两个表之间有一个n:m关系:ServiceTypeUserType这依赖于第3个表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'附近:错误:类CommonBundle \ Entity \ ServiceType没有名为service的关联

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

    class ServiceType
    {

        protected $id;
        protected $name;
        protected $active = true;
        ...

    }

另一个是ServiceUserType

class ServiceUserType
{

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\CommonBundle\Entity\ServiceType")
     * @ORM\JoinColumn(name="service_id", referencedColumnName="id")
     */
    protected $service;

    /**
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="\CommonBundle\Entity\UserType")
     * @ORM\JoinColumn(name="user_type_id", referencedColumnName="id")
     */
    protected $user_type;

    /**
     * @ORM\Column(name="active", type="boolean", nullable=true)
     */
    protected $active = true;
    ...
}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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

/**
 *@ORM\OneToMany(targetEntity="\CommonBundle\Entity\ServiceUserType", 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 Class的属性服务上添加inversedBy选项,并在Service Type类的构造函数中将属性$ serviceUserTypes设置为等于新的ArrayCollection。