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

时间:2017-06-29 15:14:37

标签: symfony doctrine-orm

我有一个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 AppBundle\Entity\Customer has no field or association named address

有没有办法可以在像这样的查询中使用实体的方法?

1 个答案:

答案 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 这样做。