0

複数の orWhere ステートメントを含むクエリがあります。PHP コードは次のようになります。

$firstDay = $params['datetimeForMonth']->format('Y-m-d');
$lastDay = $params['datetimeForMonth']->format('Y-m-t 23:59:59');
$whereStatement = "(s.level = ?
    AND s.idForLevel IN (?) 
    AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay')";
$q = Doctrine_Query::create()
    ->from('Mmb_Model_Schedule s')
    ->where($whereStatement, ['prefecture', $this->id])
    ->orWhere($whereStatement, ['district', $districtIds])
    ->orWhere($whereStatement, ['municipality', $municipalityIds])
    ->orWhere($whereStatement, ['workplace',    $workplaceIds])
    ->orWhere($whereStatement, ['user', $userIds]);

変数 $districtIds、$municipalityIds、$workplaceIds、および $userIds はすべて、コンマ区切りの値として事前に定義されています。

このクエリは、地区 ID を除くすべてのレベルで問題なく機能します。レベルが「区」のレコードは、クエリで返されません。

本当に奇妙なのは、バインドされたパラメーターを使用せずに次のコードを挿入すると、すべてが正常に機能することです。

->orWhere("s.level = 'district' AND s.idForLevel IN ($districtIds) AND s.startDatetime BETWEEN '$firstDay' AND '$lastDay'")

さらに腹立たしいのは、バインドされたパラメーターを使用すると、単一の where ステートメント (他のすべてを除く) として単独で実行されるこのクエリでさえ、何も得られないことです。

そして、それだけでは不十分であるかのように、'district' という単語が問題を引き起こしている場合に備えて、'district' を 'prefDistrict' に変更してテーブルを更新してみました。何も変わっていません。

直接入力する場合とまったく同じデータをバインドされたパラメーターとして挿入しているにもかかわらず、動作は劇的に変化します。ここで何が起こっているのですか?

4

1 に答える 1

0

$districtIdsvar の値には、Doctrine のクエリ ビルダーをつまずかせている何かがあるに違いないと言いたいです。それらの値のサンプルを投稿できますか?

また、Doctrine が実行する生成された SQL を確認しましたか (SQL ログを追跡するか、preExecute イベントにフックします)。そのようなものの出力を見てみたいと思います。

(これはおそらくコメントのはずですが、私の評判はそれほど高くありません;))

于 2013-05-21T17:21:25.073 に答える