您好,登錄后才能下訂單哦!
這篇文章主要介紹yii2中查詢數據的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
數據查詢
User::find()->all(); 此方法返回所有數據; User::findOne($id); 此方法返回 主鍵 id=1 的一條數據(舉個例子); User::find()->where(['name' => '小伙兒'])->one(); 此方法返回 ['name' => '小伙兒'] 的一條數據; User::find()->where(['name' => '小伙兒'])->all(); 此方法返回 ['name' => '小伙兒'] 的所有數據; User::find()->orderBy('id DESC')->all(); 此方法是排序查詢; User::findBySql('SELECT * FROM user')->all(); 此方法是用 sql 語句查詢 user 表里面的所有數據; User::findBySql('SELECT * FROM user')->one(); 此方法是用 sql 語句查詢 user 表里面的一條數據; User::find()->andWhere(['sex' => '男', 'age' => '24'])->count('id'); 統計符合條件的總條數; User::find()->one(); 此方法返回一條數據; User::find()->all(); 此方法返回所有數據; User::find()->count(); 此方法返回記錄的數量; User::find()->average(); 此方法返回指定列的平均值; User::find()->min(); 此方法返回指定列的最小值 ; User::find()->max(); 此方法返回指定列的最大值 ; User::find()->scalar(); 此方法返回值的第一行第一列的查詢結果; User::find()->column(); 此方法返回查詢結果中的第一列的值; User::find()->exists(); 此方法返回一個值指示是否包含查詢結果的數據行; User::find()->batch(10); 每次取 10 條數據 User::find()->each(10); 每次取 10 條數據, 迭代查詢
多表查詢:
/* 多表聯查 */ $model=new Customer(); $model->fiind()->join(‘LEFT JOIN‘,‘student‘,‘student.cid=customer.id‘) ->where(‘student.id‘=>\Yii::$app->user->id) ->andwhere(‘is_ok=1‘) ->one()
關聯查詢
使用 AR 方法也可以查詢數據表的關聯數據(如,選出表A的數據可以拉出表B的關聯數據)。 有了 AR, 返回的關聯數據連接就像連接關聯主表的 AR 對象的屬性一樣。
建立關聯關系后,通過 $customer->orders 可以獲取 一個 Order 對象的數組,該數組代表當前客戶對象的訂單集。
定義關聯關系使用一個可以返回 [[yii\db\ActiveQuery]] 對象的 getter 方法, [[yii\db\ActiveQuery]]對象有關聯上下文的相關信息,因此可以只查詢關聯數據。
class Customer extends \yii\db\ActiveRecord { public function getOrders() { // 客戶和訂單通過 Order.customer_id -> id 關聯建立一對多關系 return $this->hasMany(Order::className(), ['customer_id' => 'id']); } } class Order extends \yii\db\ActiveRecord { // 訂單和客戶通過 Customer.id -> customer_id 關聯建立一對一關系 public function getCustomer() { return $this->hasOne(Customer::className(), ['id' => 'customer_id']); } }
以上使用了[[yii\db\ActiveRecord::hasMany()]] 和 [[yii\db\ActiveRecord::hasOne()]]方法。以上兩例分別是關聯數據多對一關系和一對一關系的建模范例。如,一個客戶有很多訂單,一個訂單只歸屬一個客戶。兩個方法都有兩個參數并返回[[yii\db\ActiveQuery]]對象。
建立關聯關系后,獲取關聯數據和獲取組件屬性一樣簡單, 執行以下相應getter方法即可:
// 取得客戶的訂單 $customer = Customer::findOne(1); $orders = $customer->orders; // $orders 是 Order 對象數組
以上代碼實際執行了以下兩條 SQL 語句:
SELECT * FROM customer WHERE id=1; SELECT * FROM order WHERE customer_id=1;
有時候需要在關聯查詢中傳遞參數,如不需要返回客戶全部訂單, 只需要返回購買金額超過設定值的大訂單, 通過以下getter方法聲明一個關聯數據 bigOrders:
class Customer extends \yii\db\ActiveRecord { public function getBigOrders($threshold = 100) { return $this->hasMany(Order::className(), ['customer_id' => 'id']) ->where('subtotal > :threshold', [':threshold' => $threshold]) ->orderBy('id'); } }
聯合查詢
使用關系數據庫時,普遍要做的是連接多個表并明確地運用各種 JOIN 查詢。 JOIN SQL語句的查詢條件和參數,使用 [[yii\db\ActiveQuery::joinWith()]] 可以重用已定義關系并調用 而不是使用 [[yii\db\ActiveQuery::join()]] 來實現目標。
// 查找所有訂單并以客戶 ID 和訂單 ID 排序,并貪婪加載 "customer" 表 $orders = Order::find()->joinWith('customer')->orderBy('customer.id, order.id')->all(); // 查找包括書籍的所有訂單,并以 `INNER JOIN` 的連接方式即時加載 "books" 表 $orders = Order::find()->innerJoinWith('books')->all();
以上方法[[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]]是訪問INNER JOIN類型的[[yii\db\ActiveQuery::joinWith()
|joinWith()]]的快捷方式。
可以連接一個或多個關聯關系,可以自由使用查詢條件到關聯查詢, 也可以嵌套連接關聯查詢。如:
// 連接多重關系 // 找出24小時內注冊客戶包含書籍的訂單 $orders = Order::find()->innerJoinWith([ 'books', 'customer' => function ($query) { $query->where('customer.created_at > ' . (time() - 24 * 3600)); } ])->all(); // 連接嵌套關系:連接 books 表及其 author 列 $orders = Order::find()->joinWith('books.author')->all();
代碼背后, Yii 先執行一條 JOIN SQL 語句把滿足 JOIN SQL 語句查詢條件的主要模型查出, 然后為每個關系執行一條查詢語句, bing填充相應的關聯記錄。
[[yii\db\ActiveQuery::joinWith()|joinWith()]] 和 [[yii\db\ActiveQuery::with()|with()]] 的區別是 前者連接主模型類和關聯模型類的數據表來檢索主模型, 而后者只查詢和檢索主模型類。 檢索主模型
由于這個區別,你可以應用只針對一條 JOIN SQL 語句起效的查詢條件。 如,通過關聯模型的查詢條件過濾主模型,如前例, 可以使用關聯表的列來挑選主模型數據,
當使用 [[yii\db\ActiveQuery::joinWith()|joinWith()]] 方法時可以響應沒有歧義的列名。 In the above examples, we useitem.id and order.id to disambiguate the id column references 因為訂單表和項目表都包括 id 列。
當連接關聯關系時,關聯關系默認使用即時加載。你可以 通過傳參數 $eagerLoading 來決定在指定關聯查詢中是否使用即時加載。
默認 [[yii\db\ActiveQuery::joinWith()|joinWith()]] 使用左連接來連接關聯表。 你也可以傳 $joinType 參數來定制連接類型。 你也可以使用 [[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]]。
Yii2 分頁
控制器 CommentController 里面的任意一個方法,在這里我的方法是 actionComment();
use yii\data\Pagination; use app\models\Comment; public function actionComment(){ $data = Comment::find()->andWhere(['id' => '10']); $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '2']); $model = $data->offset($pages->offset)->limit($pages->limit)->all(); return $this->render('comment',[ 'model' => $model, 'pages' => $pages, ]); }
view 里面的代碼
<?php use yii\widgets\LinkPager; ?> foreach($model as $key=>$val) { 這里就是遍歷數據 } <?= LinkPager::widget(['pagination' => $pages]); ?>
in() 操作
SELECT * FROM `categ_price` WHERE `id` IN (9, 11)
$categ_price_id=[9>1,11=>3] $categPriceModel= \common\models\CategPrice::find()->where(['id' =>array_keys($categ_price_id)])->all(); #>where(['id' => [1, 2, 3]])
not in() 操作
SELECT * FROM `shop` WHERE (status=1) AND (`id` NOT IN (88, 93))
$shopModel= Shop::find()->where('status=1')->andWhere(['not in','id',[88,98]])->all();
以上是“yii2中查詢數據的方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。