首頁  >  文章  >  php框架  >  yii2怎麼查詢數據

yii2怎麼查詢數據

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼原創
2019-12-09 14:17:254209瀏覽

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([&#39;pagination&#39; => $pages]); ?>

in() 操作

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

$categ_price_id=[9>1,11=>3]
  $categPriceModel= \common\models\CategPrice::find()->where([&#39;id&#39; =>array_keys($categ_price_id)])->all();
  #>where([&#39;id&#39; => [1, 2, 3]])

not in() 操作

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

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

PHP中文網,有大量免費的

Yii入門教學,歡迎大家學習!

以上是yii2怎麼查詢數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn