我有一个 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 AppBundleEntityCustomer has no field or association named address
有什么方法可以在这样的查询中使用实体的方法?
简短答案 - 不,您真的不想。您将PHP逻辑与SQL Logic混合在一起。您的address()
功能是纯PHP功能。即使它在您的实体内使用关系,学说本身也无法了解这一点。您的功能实际上是返回字符串,那么它将如何知道如何将其转换为WHERE
子句的SQL?
只需将您的原始查询更改为:
$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混合进一步混合,我强烈建议您做这样做。