ホームページ > PHPフレームワーク > YII > yii2 でデータをクエリする方法

yii2 でデータをクエリする方法

爱喝马黛茶的安东尼
リリース: 2019-12-09 14:17:25
オリジナル
4273 人が閲覧しました

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()]] メソッドを使用しています。上記 2 つの例は、それぞれ関連データにおける多対 1 の関係と 1 対 1 の関係のモデル化例です。たとえば、顧客に多数の注文があり、1 つの注文は 1 人の顧客にのみ属するとします。どちらのメソッドにも 2 つのパラメータがあり、[[yii\db\ActiveQuery]] オブジェクトを返します。

関連付けを確立した後、関連付けられたデータを取得することは、コンポーネントの属性を取得するのと同じくらい簡単です。次の対応するゲッター メソッドを実行するだけです:

// 取得客户的订单
$customer = Customer::findOne(1);
$orders = $customer->orders; // $orders 是 Order 对象数组
ログイン後にコピー

上記のコードは、実際には次の 2 つの SQL ステートメントを実行します。

SELECT * FROM customer WHERE id=1;
SELECT * FROM order WHERE customer_id=1;
ログイン後にコピー

関連クエリでパラメータを渡す必要がある場合があります。たとえば、顧客の注文をすべて返す必要がない場合は、購入金額が設定値を超える大量の注文のみを返す必要があります。次のゲッター メソッドを使用して、関連データ 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 Queryリレーショナル データベースを使用する場合、一般的に行われるのは次のとおりです。複数のテーブルを結合し、さまざまな 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()]] のショートカット。

1 つ以上の関連関係を接続したり、関連クエリにクエリ条件を自由に使用したり、接続された関連クエリをネストしたりできます。例:

// 连接多重关系
// 找出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( )]] メソッドは、明確な列名に応答できます。上記の例では、order テーブルと items テーブルの両方に id 列が含まれているため、item.id と order.id を使用して id 列参照の曖昧さを解消しています。

関連付けに接続する場合、関連付けはデフォルトでインスタントロードを使用します。 $eagerLoading パラメーターを渡すことで、指定した関連クエリで積極的な読み込みを使用するかどうかを決定できます。

デフォルト [[yii\db\ActiveQuery::joinWith()|joinWith()]] は、左結合を使用して関連テーブルを結合します。 $joinType パラメータを渡して結合タイプをカスタマイズすることもできます。 [[yii\db\ActiveQuery::innerJoinWith()|innerJoinWith()]] を使用することもできます。

Yii2 Paging

コントローラー 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,
       ]);
  }
ログイン後にコピー

内部のコードを表示

<?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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート