我有一个Customers
表格,其中包含字段name
,addressLine1
,addressLine2
和postcode
。相应的实体还有一个名为address
的方法,它返回2个地址行,邮政编码与逗号/空格分隔连接在一起,忽略任何空字段。
我想返回按名称和地址排序的客户列表(对于任何具有相同名称的客户)。目前我试试
$this->getEntityManager()->createQuery(
'SELECT c FROM AppBundle:Customer c ORDER BY c.name ASC, c.address ASC'
)->getResult();
但是我不能像这样在查询中使用方法Customer::address()
。我收到了错误
Error: Class AppBundle\Entity\Customer has no field or association named address
有没有办法可以在像这样的查询中使用实体的方法?
答案 0 :(得分:1)
简短回答 - 不,你并不是真的想要。您正在将PHP逻辑与SQL逻辑混淆。您的address()
函数是一个纯PHP函数。尽管它在您的实体中使用关系,但Doctrine本身无法了解它。你的函数实际上是返回一个字符串,那么它如何知道如何将它转换为SQL WHERE
子句呢?
只需将原始查询更改为:
$this->getEntityManager()->createQuery('
SELECT c
FROM AppBundle:Customer c
ORDER BY c.name ASC, c.addressLine1 ASC, c.addressLine2 ASC, c.postcode ASC
')->getResult();
我想你可以伪造你想要的东西:
客户实体:
public static function addressSort()
{
return ' c.addressLine1 ASC, c.addressLine2 ASC, c.postcode ';
}
然后再做
$this->getEntityManager()->createQuery('
SELECT c
FROM AppBundle:Customer c
ORDER BY c.name ASC, ' . Customer::addressSort()
)->getResult();
然而,现在你进一步混合了PHP和SQL,我强烈建议你做 NOT 这样做。