1.where($condition,$params=[ ])
2.最近使用where()時候發現了一個錯誤,搞得我很莫名其妙。
我甚至一度懷疑數據庫系統出了問題,經過一番檢查果然還是自己語法寫錯了,記下來,分享給大家。
<?php
$query1=FriendList::find()->where(['and','user_id'=>6,'friend_id'=>7]); //錯誤
$query2=FriendList::find()->where(['and','user_id=6','friend_id=7']); //正確
?>
第一句,是我寫的,目的就是查user_id=6和friend_id=7 的這條數據,結果給我返回的是全部數據,而且也沒有語法報錯。
最後通過打出原生sql語句,以及查教程,發現第一句是錯誤的寫法,第二句纔是正確的。
下面給出原生sql語句:(可以發現,第一句原生sql語句where條件已經起不到作用了,所以返回了所有數據)
如果非要使用第一種寫法的話,可以把‘and’去掉,默認多個條件並列就是‘and’:
<?php
$query1=FriendList::find()->where(['user_id'=>6,'friend_id'=>7]); //正確
//還可以這樣寫
$query1=FriendList::find()->where(['and',['user_id'=>6],['friend_id'=>7]]); //正確
?>
如果有條件中有變量的話,一般用數據綁定的方法書寫。( 4.6魏曦教你學yii2)
<?php$query=FriendList::find()
->where(['or','user_id=:user_id','friend_id=:friend_id'])
->addParams([':user_id'=>Yii::$app->user->identity->id,
':friend_id'=>Yii::$app->user->identity>id]);
/*直接都在where語句裏綁定也行
where(['or','user_id=:user_id','friend_id=:friend_id'],
[':user_id'=>Yii::$app->user->identity->id,
':friend_id'=>Yii::$app->user->identity>id])
*/
var_dump($query->createCommand()->getRawSql());
exit(0);
?>
3.在AR查詢和查詢構建器查詢中,列名、表名、連接詞 可以用雙引號或者單引號,一般都用 單引號,什麼都不用會報錯。
<?php
$query1=FriendList::find()->where(['user_id'=>6]); //單引號
$query2=FriendList::find()->where(["user_id"=>6]); //雙引號
echo "<pre>";
echo '$query1的原生sql語句:';
var_dump($query1->createCommand()->getRawSql());
echo '$query2的原生sql語句:';
var_dump($query1->createCommand()->getRawSql());
exit(0);
?>
結果:(使用單雙引號,結果都是被轉成了一樣的原生sql語句,不寫的話會報錯)
3.where()養成習慣,把條件語句用數組符號[ ]框起來。
例1:
<?php
$query1=FriendList::find()->where('user_id'=>6); //會報錯,不符合語法
?>
這種寫法
4.查詢構建器
<?php
$query=(new \yii\db\query)
->select('id,name')
->from('post');
//->select('id','name')只會查詢前一個,後面那個會被忽略
//->select(['id','name']) 的寫法也是正確的
?>
補充知識點: