yii2怎么查詢數據

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 對象的數組,該數組代表當前客戶對象的訂單集。

定義關聯關系使用一個可以返回 [[yiidbActiveQuery]] 對象的 getter 方法, [[yiidbActiveQuery]]對象有關聯上下文的相關信息,因此可以只查詢關聯數據。

class?Customer?extends?yiidbActiveRecord { ????public?function?getOrders() ????{ ????????//?客戶和訂單通過?Order.customer_id?->?id?關聯建立一對多關系 ????????return?$this->hasMany(Order::className(),?['customer_id'?=>?'id']); ????} } ? class?Order?extends?yiidbActiveRecord { ????//?訂單和客戶通過?Customer.id?->?customer_id?關聯建立一對一關系 ????public?function?getCustomer() ????{ ????????return?$this->hasOne(Customer::className(),?['id'?=>?'customer_id']); ????} }

以上使用了[[yiidbActiveRecord::hasMany()]] 和 [[yiidbActiveRecord::hasOne()]]方法。以上兩例分別是關聯數據多對一關系和一對一關系的建模范例。如,一個客戶有很多訂單,一個訂單只歸屬一個客戶。兩個方法都有兩個參數并返回[[yiidbActiveQuery]]對象。

建立關聯關系后,獲取關聯數據和獲取組件屬性一樣簡單, 執行以下相應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?yiidbActiveRecord { ????public?function?getBigOrders($threshold?=?100) ????{ ????????return?$this->hasMany(Order::className(),?['customer_id'?=>?'id']) ????????????->where('subtotal?>?:threshold',?[':threshold'?=>?$threshold]) ????????????->orderBy('id'); ????} }

聯合查詢

使用關系數據庫時,普遍要做的是連接多個表并明確地運用各種 JOIN 查詢。 JOIN SQL語句的查詢條件和參數,使用 [[yiidbActiveQuery::joinWith()]] 可以重用已定義關系并調用 而不是使用 [[yiidbActiveQuery::join()]] 來實現目標。

//?查找所有訂單并以客戶?ID?和訂單?ID?排序,并貪婪加載?"customer"?表 $orders?=?Order::find()->joinWith('customer')->orderBy('customer.id,?order.id')->all(); //?查找包括書籍的所有訂單,并以?`INNER?JOIN`?的連接方式即時加載?"books"?表 $orders?=?Order::find()->innerJoinWith('books')->all();

以上方法[[yiidbActiveQuery::innerJoinWith()|innerJoinWith()]]是訪問INNER JOIN類型的[[yiidbActiveQuery::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填充相應的關聯記錄。

[[yiidbActiveQuery::joinWith()|joinWith()]] 和 [[yiidbActiveQuery::with()|with()]] 的區別是 前者連接主模型類和關聯模型類的數據表來檢索主模型, 而后者只查詢和檢索主模型類。 檢索主模型

由于這個區別,你可以應用只針對一條 JOIN SQL 語句起效的查詢條件。 如,通過關聯模型的查詢條件過濾主模型,如前例, 可以使用關聯表的列來挑選主模型數據,

當使用 [[yiidbActiveQuery::joinWith()|joinWith()]] 方法時可以響應沒有歧義的列名。 In the above examples, we useitem.id and order.id to disambiguate the id column references 因為訂單表和項目表都包括 id 列。

當連接關聯關系時,關聯關系默認使用即時加載。你可以 通過傳參數 $eagerLoading 來決定在指定關聯查詢中是否使用即時加載。

默認 [[yiidbActiveQuery::joinWith()|joinWith()]] 使用左連接來連接關聯表。 你也可以傳 $joinType 參數來定制連接類型。 你也可以使用 [[yiidbActiveQuery::innerJoinWith()|innerJoinWith()]]。

Yii2 分頁

控制器 CommentController 里面的任意一個方法,在這里我的方法是 actionComment();

use?yiidataPagination; use?appmodelsComment; ??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 yiiwidgetsLinkPager; ?> ??????foreach($model?as?$key=&gt;$val) ??????{ ???????????這里就是遍歷數據 ??????} ??????=?LinkPager::widget(['pagination'?=&gt;?$pages]);??&gt;

in() 操作

SELECT * FROM `categ_price` WHERE `id` IN (9, 11)

$categ_price_id=[9&gt;1,11=&gt;3] ??$categPriceModel=?commonmodelsCategPrice::find()-&gt;where(['id'?=&gt;array_keys($categ_price_id)])-&gt;all(); ??#&gt;where(['id'?=&gt;?[1,?2,?3]])

not in() 操作

SELECT * FROM `shop` WHERE (status=1) AND (`id` NOT IN (88, 93))

$shopModel=?Shop::find()-&gt;where('status=1')-&gt;andWhere(['not?in','id',[88,98]])-&gt;all();

PHP中文網,有大量免費的Yii入門教程,歡迎大家學習!

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享