>PHP 프레임워크 >YII >yii2에서 데이터를 쿼리하는 방법

yii2에서 데이터를 쿼리하는 방법

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-12-09 14:17:254302검색

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 \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']);
    }
}

위에서는 [[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 \yii\db\ActiveRecord
{
    public function getBigOrders($threshold = 100)
    {
        return $this->hasMany(Order::className(), ['customer_id' => 'id'])
            ->where('subtotal > :threshold', [':threshold' => $threshold])
            ->orderBy('id');
    }
}

Joint query

관계형 데이터베이스를 사용할 때 일반적으로 해야 할 일은 여러 테이블을 조인하고 다양한 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()]] 메소드를 사용하면 모호한 열 이름 없이 응답할 수 있습니다. 위의 예에서는 order 테이블과 items 테이블 모두 id 열을 포함하므로 item.id와 order.id를 사용하여 id 열 참조를 명확하게 합니다.

협회에 연결할 때 협회는 기본적으로 즉시 로딩을 사용합니다. $eagerLoading 매개변수를 전달하여 지정된 관련 쿼리에서 즉시 로딩을 사용할지 여부를 결정할 수 있습니다.

기본적으로 [[yiidbActiveQuery::joinWith()|joinWith()]]는 왼쪽 조인을 사용하여 관련 테이블을 조인합니다. $joinType 매개변수를 전달하여 조인 유형을 사용자 정의할 수도 있습니다. [[yiidbActiveQuery::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,
       ]);
  }

보기 코드 내부

<?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으로 문의하세요.