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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM