在 Doctrine 的查询中使用实体的方法



我有一个 Customers的表,带有 nameaddressLine1addressLine2postcode。相应的实体还具有一种称为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混合进一步混合,我强烈建议您做这样做。

最新更新