0

Yiiを使用して次のクエリを作成できません。

SELECT recipientId as broadcasterId, SUM(quantity) as quantity FROM `creditlog` 
WHERE websiteId=3 AND timeAdded>='2013-01-17' 
AND timeAdded<='2013-02-17' 
AND recipientId IN (10000024, 10000026, 1000028) GROUP BY `recipientId`

私は試した:

$command = Yii::app()->db->createCommand();
$command->select('recipientId as broadcasterId, SUM(quantity) as quantity');
$command->from('creditlog');

$command->where('websiteId=:websiteId AND timeAdded>=:dateStart AND timeAdded<=:dateEnd AND recipientId IN (:recipients)',array(':websiteId' => $websiteId, ':dateStart' => $dateStart, ':dateEnd' => $dateEnd, ':recipients' => $broadcasterIds));

$command->group('recipientId');

また、andWhere()ドキュメントにある機能が欠落しているようです。

問題はそのIN状態ですが、それを書き直す方法が見つかりません。

4

1 に答える 1

4

にアクセスできないため、作業がandWhereはるかに簡単になるため、次のwhereようにパラメータを表現する必要があります。

$command->where(array(
    array('and', 
          'websiteId=:websiteId',
          array('and', 
                'timeAdded>=:dateStart',
                 array('and',
                       // ...

), $parameters);

これは、ある時点で適切なarray('in', 'recipientId', $values)構文を使用してIN(...)SQLを生成できるようにするために行われます。

ただし、これは醜く、管理が困難です。すべての条件が単純に結合されている限り、AND次のような適切なデータ表現からプログラムでデータ構造を構築できます(実際には、これは欠落している場合の回避策ですandWhere)。

$conditions = array(
    'websiteId=:websiteId',
    'timeAdded>=:dateStart',
    'timeAdded<=:dateEnd',
    array('in', 'recipientId', $broadcasterIds),

);

$where = null;
foreach ($conditions as $condition) {
    if (!$where) {
        $where = $condition;
    }
    else {
        $where = array('and', $where, $condition);
    }
}

$command->where($where, $parameters);

物事を表現するこの方法を使用する必要がある理由の詳細については、のドキュメントを参照してくださいCDbCommand::where

于 2013-01-17T10:35:57.140 に答える