我在两个表之间有一个n:m
关系:ServiceType
和UserType
这依赖于第3个表ServiceUserType
作为n:m结果。我正在尝试从我的表单构建器获取user_type=1
和active=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;
...
}
我做错了什么?
答案 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。