操作
Backport(バックポート) #3081
完了activity/community.json 実行時にDoctrineでエラーが発生する場合がある
開始日:
2012-05-10
期日:
進捗率:
100%
予定工数:
説明
現象¶
activity/community.json 呼び出し時に下記のようなエラーがhttpdのエラーログに出力されて500エラーとなる。
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens
is_active: 0 のメンバー(仮登録中のメンバー)が1人以上いる場合に発生する。
原因¶
マイフレンドまで公開のアクティビティを取得するための条件の中で、is_active: 0 のメンバーを対象外とするためにサブクエリ内に member_id_to NOT IN ?
を追加していたが、この形式の DQL を Doctrine が正しくパースできず、最終的にパラメーター数が一致しない SQL とパラメーターの組が生成されていたためにエラーとなっていた。
inactiveIds が空の場合は opDoctrineQuery::andWhereIn() により ->andWhere('0 = 1');
に書き換えられるため問題が発生しない。
修正内容¶
問題箇所のクエリでは Member モデルを必ず leftJoin しているため、opActivateListener により is_active のチェックが自動的に追加される。
このクエリにおいて is_active: 0 のメンバーを除外するには Member に対する絞り込みのみで十分であるため、マイフレンドまで公開のアクティビティを抽出する部分からは is_active: 0 を除外する条件を冗長と判断し削除した。
操作