如何在查询生成器中重现此内容
AND LENGTH( CONCAT_WS('', lsc.door_code, lsc.alarm_code, lsc.service_code, lsc.master_log) ) > 0"
我这样尝试
$orX = $qb->expr()->orX();
$orX
->add($qb->expr()->length('lsc.doorCode > 0'))
->add($qb->expr()->length('lsc.alarmCode > 0'))
->add($qb->expr()->length('lsc.serviceCode > 0'))
->add($qb->expr()->length('lsc.masterLog > 0'));
$qb->andWhere($orX);
有错误:
[Syntax Error] line 0, col 549: Error: Expected DoctrineORMQueryLexer::T_CLOSE_PARENTHESIS, got '>'
和我的查询
SELECT
CONCAT(
IFNULL(location.name, ''),' (',IFNULL(location.streetAddress, ''),' ',IFNULL(location.staircase, ''),' ',IFNULL(location.flatNumber, ''),' ',IFNULL(location.postal, ''),' ',IFNULL(location.postOffice, ''),')') as address,
lsc.doorCode,
lsc.serviceCode,
lsc.alarmCode,
lsc.masterLog
FROM AppBundle:LocationServiceCompany lsc INNER JOIN lsc.location location WHERE lsc.serviceCompany = :sc AND (LENGTH(lsc.doorCode > 0) OR LENGTH(lsc.alarmCode > 0) OR LENGTH(lsc.serviceCode > 0) OR LENGTH(lsc.masterLog > 0))
如何使用长度?
我来这里是因为我在查询生成器中使用长度时遇到了类似的问题。我尝试了($qb->expr((->length('lsc.doorCode> 0'(,但它不起作用。它的SQL输出是"LENGTH(lsc.doorCode> 0(",它抛出了一个错误。
我对这个问题的解决方案是:
$qb->expr()->gt($qb->expr()->length('lsc.doorCode'), 0)
生成正确的SQL语法"LENGTH(lsc.doorCode(>0"。
你这里有一个错字:
$orX = $qb->expr()->orX();
$orX
->add($qb->expr()->length('lsc.doorCode > 0')); <--
->add($qb->expr()->length('lsc.alarmCode > 0'))
->add($qb->expr()->length('lsc.serviceCode > 0'))
->add($qb->expr()->length('lsc.masterLog > 0'));
$qb->andWhere($orX);
删除;
并消除语法错误。
对于连接长度,您可以尝试如下操作:
$query->andWhere("LENGTH( CONCAT_WS('', lsc.door_code, lsc.alarm_code, lsc.service_code, lsc.master_log) ) > 0")
更新后您可以使用 Doctrine 运行本机 SQL 查询,如下所示:
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html#the-nativequery-class
供参考:
<?php
use DoctrineORMQueryResultSetMapping;
$rsm = new ResultSetMapping();
// build rsm here
$query = $entityManager->createNativeQuery('SELECT id, name, discr FROM users WHERE name = ?', $rsm);
$query->setParameter(1, 'romanb');
$users = $query->getResult();
如果更新的查询有效,这将是使其正常工作的一种方法。