查询生成器,喜欢

时间:2013-12-30 15:12:09

标签: doctrine-orm query-builder

我在查询生成器中遇到问题:

我有SyntaxError:

[Syntax Error] line 0, col 243: Error: Expected '.' or '(', got 'type'


QueryException: SELECT z as task, GROUP_CONCAT(DISTINCT o.tahoObject) as type FROM Cloud\CrmBundle\Entity\Tasks z LEFT JOIN z.taskOwner u LEFT JOIN z.taskTasksHasObject o WHERE z.taskDone = :ztaskDone AND u.userFirstnameLastname = :uuserFirstnameLastname AND type LIKE :type GROUP BY z.taskId ORDER BY z.taskDate desc 

我像查询生成器一样添加:

$qb->andWhere($filter['field'][0].' LIKE :' :type);
$qb->setParameter('type', '%'.$eachOption.'%');

我通过'getParameters()'检查了类型paremeter是否正确给出所以我不明白为什么我有这个语法错误... Group_concat也正常工作,问题是只有当我添加像...有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是您当前的查询 - 它是错误的,因为在WHERE子句中它不知道名为type的字段:

SELECT 
    z as task,
    GROUP_CONCAT(DISTINCT o.tahoObject) as type
FROM Cloud\CrmBundle\Entity\Tasks z
    LEFT JOIN z.taskOwner u
    LEFT JOIN z.taskTasksHasObject o
WHERE z.taskDone = :ztaskDone
    AND u.userFirstnameLastname = :uuserFirstnameLastname
    AND type LIKE :type
GROUP BY z.taskId
ORDER BY z.taskDate desc

要解决此问题,您需要通过在where子句中使用GROUP_CONCAT来重构查询(但我不确定您是否可以在where子句中的GROUP_CONCAT内部执行DISTINCT - 您可以尝试):

SELECT 
    z.taskId as task,   -- z as task did not make sense to me 
    GROUP_CONCAT(DISTINCT o.tahoObject) as type
FROM Cloud\CrmBundle\Entity\Tasks z
    LEFT JOIN z.taskOwner u   -- ON ... is missing
    LEFT JOIN z.taskTasksHasObject o   -- ON ... is missing 
WHERE z.taskDone = :ztaskDone
    AND u.userFirstnameLastname = :uuserFirstnameLastname
    AND GROUP_CONCAT(DISTINCT o.tahoObject) LIKE :type
GROUP BY z.taskId
ORDER BY z.taskDate desc

或者您可能需要执行嵌套查询:

SELECT task, type
FROM (
    SELECT 
        z.taskId as task,   -- z as task did not make sense to me 
        GROUP_CONCAT(DISTINCT o.tahoObject) as type
    FROM Cloud\CrmBundle\Entity\Tasks z
        LEFT JOIN z.taskOwner u   -- ON ... is missing
        LEFT JOIN z.taskTasksHasObject o   -- ON ... is missing
    WHERE z.taskDone = :ztaskDone
        AND u.userFirstnameLastname = :uuserFirstnameLastname
    GROUP BY z.taskId
    ORDER BY z.taskDate desc
) x
WHERE x.type LIKE :type

我还想指出,您的LEFT JOINS似乎缺少连接条件。此外,选择z as task对我来说没有意义。也许你的意思是z.taskId as task?祝你好运!