2011-05-20 71 views
9

我想在活動記錄中寫入以下查詢。如何在YII活動記錄中使用IN&Between子句?

SELECT * 
FROM `User` 
WHERE `UserId` 
IN (6, 7, 8, 9) ; 

感謝

+1

抱歉沒有得到您的問題......? – Pushpendra 2011-05-20 06:02:44

+1

他正在尋找Yii中的CActivRecord語法來創建像本示例一樣的SQL語句。 – 2011-05-20 11:40:34

+0

考慮接受你的問題的答案! – Justinas 2016-09-02 11:32:19

回答

10

你可以把你的數組作爲值的特定屬性,像這樣(沒有測試):

$model=new User(); 
$result=$model->findAllByAttributes(array('UserId'=>array(6,7,8,9))); 
+0

爲什麼新用戶()?在某些方面,它優於User :: model()嗎? – 2012-12-05 14:34:36

+0

嗨鮑勃,用戶是受保護的模型的名稱/ models/user.php – 2012-12-06 09:24:01

+1

我認爲鮑勃問爲什麼在兩行而不是一個'User :: model() - > findAllByAttributes(array('UserId' =>數組(6,7,8,9)));'? – 2013-07-15 19:46:25

31

您可以使用CDbCriteria聲明:

$criteria = new CDbCriteria(); 
$criteria->addInCondition('userId', array(6,7,8,9)); 
$result = User::model()->findAll($criteria); 
+0

有沒有類似[tag:yii2]的解決方案? – SaidbakR 2015-01-12 02:14:42

0

我還在用這種方式:

public function getInterval($data_start, $data_stop){ 
    $criteria = new CDbCriteria; 
    $criteria->condition = "date >= '$data_start' AND date <= '$data_stop'"; 
    return $criteria; 
} 
$model = Object::model()->findAll(getInterval('2014-06-01','2014-06-30'); 
+0

是不是暴露給SQL注入? – Justinas 2014-07-08 12:20:52

+0

很好的問題。我會查。 – 2014-07-08 13:05:54

8

如果你希望得到您的查詢速度更快,使用命令生成器:

Yii::app()->db->createCommand() 
    ->select('*') 
    ->from('user') 
    ->where(array('in', 'UserId', array(6, 7, 8, 9))) 
    ->queryAll(); 

要通過的CActiveRecord得到它,使用findAllByAttributes

User::model() 
    ->findAllByAttributes(array(
     'UserId' => array(6,7,8,9) 
    )); 

但它會得到所有用戶的完整的對象關聯關係,因此速度較慢。

+1

'where(array('in','column_name',array())'救了我,歡呼! – Mave 2015-05-01 09:29:11

0

在yii中有一個叫findAllBySql的函數來運行sql查詢並獲取輸出。

$sql="SELECT * FROM `User` WHERE `UserId` IN (6, 7, 8, 9)";//Your Sql query 
$value=User::model()->findAllBySql($sql);// "User" is the model belongs to the table 'User' 

的「$值」將一個數組中返回結果。要獲取這些值,您可以使用以下方法。

foreach($value as $val){ 
    echo $val->UserId; 
} 

(或)

var index=0; 
echo $val[$index]->UserId; 
3

您可以使用在國內外之間的語句直通CDbCriteria:

$criteria = new CDbCriteria(); 
$criteria->addInCondition("id", array(6,7,8,9)); 
$criteria->addBetweenCondition('id', '10', '20', 'OR'); 
$result = User::model()->findAll($criteria); 

這將導致SQL查詢這樣的:

SELECT * 
FROM `User` 
WHERE `id` 
IN (6, 7, 8, 9) 
OR `id` BETWEEN 10 AND 20 

請注意第4個參數addBetweenCondition()方法;錯過它,將應用默認的將該條件連接到WHERE查詢的其餘部分。

P.S.嚴格地說,那些addBetweenCondition()addInCondition()方法應該添加到現有條件。所以,你可能需要先設定一個標準的初始條件是這樣的:

$criteria->condition = '1=1'; 
0

要麼你可以使用addInCondition,或者您也可以使用比較方法。

$criteria = new CDbCriteria(); 
$criteria->compare('UserId',array(6,7,8,9)); 
$userDataObj = User::model()->findAll($criteria); 
相關問題