这个错误似乎是一个错误,因为我的查询中没有位置参数。这是方法:
public function getAll(User $user, DateTime $start = null, DateTime $end = null)
{
$params = array('user_id' => $user->getId());
$rsm = new \Doctrine\ORM\Query\ResultSetMapping(); // Result set mapping
$rsm->addScalarResult('subtype', 'subtype');
$rsm->addScalarResult('count', 'count');
$sms_sql =
"SELECT CONCAT('sms_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(messages_count * (customers_count + recipients_count)) AS count " .
"FROM outgoing_message AS m INNER JOIN small_text_message AS s ON " .
"m.id = s.id WHERE status <> 'pending' AND user_id = :user_id";
$news_sql =
"SELECT CONCAT('news_', IF(is_auto = 0, 'user' , 'auto')) AS subtype, " .
"SUM(customers_count + recipients_count) AS count " .
"FROM outgoing_message AS m JOIN newsletter AS n ON m.id = n.id " .
"WHERE status <> 'pending' AND user_id = :user_id";
if($start) :
$sms_sql .= " AND sent_at >= :start";
$news_sql .= " AND sent_at >= :start";
$params['start'] = $start->format('Y-m-d');
endif;
$sms_sql .= ' GROUP BY type, is_auto';
$news_sql .= ' GROUP BY type, is_auto';
return $this->_em->createNativeQuery("$sms_sql UNION ALL $news_sql", $rsm)
>setParameters($params)->getResult();
}
这引发了异常:
SQLSTATE [HY093]:参数号无效:混合命名和位置 参数
数组$params
没问题,所以generated SQL:
var_dump($params);
array (size=2)
'user_id' => int 1
'start' => string '2012-01-01' (length=10)
最奇怪的是,它仅适用于"$sms_sql"
!
start_date
而不是start
):
if($start) :
$sms_sql .= " AND sent_at >= :start_date";
$news_sql .= " AND sent_at >= :start_date";
$params['start_date'] = $start->format('Y-m-d');
endif;
Doctrine / PDO说:
SQLSTATE [42S22]:找不到列:1054未知列'sent1rt_date' 在'where子句'
...因为字符串1rt
已添加到列名中间!
答案 0 :(得分:2)
我认为问题在于对DocSQL的Doctrine ORM支持。
我在用于命名参数的setParameters
方法的文档中找不到任何示例。我看到的所有使用该方法的例子都是位置的,而不是命名的。
命名参数的所有示例都使用setParameter
(没有“s”)方法。它们只在SQL中显示一个匹配的占位符。
作为测试(以及可能的解决方法),尝试使SQL文本中的每个占位符都是唯一的,然后分别设置每个占位符。
看起来“命名参数”支持可能有点不完整(与我们习惯使用的Oracle和其他ORM框架相比)。看起来Doctrine可能会更好地支持位置表示法。 (这对于简单的语句很有用,但是当你有很多参数时,它可能是一个真正的熊,你需要对SQL语句进行更改。这就是命名参数的好处真正开始闪耀的地方......如果它们是支持的权利。)
以下是Doctrine ORM文档http://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html?highlight=setParameters的链接(在该页面上搜索setParameters
以获取示例。)
(请参阅我对您问题的评论。)
这可能不能真正回答你的问题,但它可能会让你朝着正确的方向前进。小心那里。