2013-01-17 2 views
0

Je ne peux pas créer la requête suivante en utilisant Yii:Yii CDbCommand créer requête

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` 

J'ai essayé:

$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'); 

également la fonction andWhere() qui est dans la documentation semble manquer.

Le problème est que la condition IN, mais je ne trouve pas un moyen de le réécrire.

+0

['andWhere' est disponible depuis v1.1.13] (http://www.yiiframework.com/doc/api/1.1/CDbCommand#andWhere-detail), peut-être que votre version est plus ancienne –

Répondre

4

Puisque vous n'avez pas accès à andWhere, ce qui rendrait la vie beaucoup plus simple, vous devez exprimer les paramètres avec where comme ceci:

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

), $parameters); 

Ceci est fait pour que vous puissiez à un usage point la syntaxe correcte array('in', 'recipientId', $values) pour produire le IN(...) SQL.

Cependant, c'est moche et difficile à gérer. Tant que toutes les conditions sont simplement réunies avec AND vous pouvez construire la structure de données par programmation à partir d'une représentation des données Saner comme celui-ci (en effet c'est une solution de contournement pour la andWhere manquante):

$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); 

Pour plus d'informations sur pourquoi cette façon d'exprimer les choses doit être utilisée, vous pouvez vous référer à la documentation pour CDbCommand::where.

+0

Eh bien, le getText() est return: AND ('recipientId' IN (\ '5339297,10000023,10000024 \')) et je ne pense pas que ce soit vrai – Samson

+0

@Samson:' $ broadcasterIds' est censé être un tableau, cela ressemble à une chaîne. – Jon

+0

droite .. ma mauvaise. 10x – Samson

Questions connexes