私のクエリには位置パラメータがないため、このエラーはバグのようです。メソッドは次のとおりです。
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
はOKなので、生成された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
列名の途中に文字列が追加されたので!