牛骨文教育服务平台(让学习变的简单)
博文笔记

YII2.0 常用查询语句

创建时间:2015-12-19 投稿人: 浏览次数:1942

本文主要说说一些基本的查询语句:

1.首先理解以下三个的返回类型:

find() 返回值是一个ActiveQuery()对象
hasOne() 与 hasMany() 返回值是 yiidbActiveQuery instance
ActiveDataProvider 返回的值是 yiidbActiveQuery instance

2.下面详细说一些常用的查询:

2.1.查询单条用户记录:

findOne() 与 find()->where()的区别
前者根据条件查询一条记录,后者根据条件查询一条或多条记录
前者的参数可以是主键,或键值对,后者参数必须是键值对。因此:

User::findOne($id);
等价于 User::findOne(["id" => $id]);
等价于 User::find()->where(["id" => $id])->one();  
等价于 User::findBySql("SELECT * FROM user")->one(); //这个查询不完全等同于以上三个

2.2. 查询单列数据

#查询一列,返回对象数组
User::find()->select("id")->all();
array(1) {
  [0]=>
  object(commonmodelsUser)#116 (8) {
    ["_attributes":"yiidbBaseActiveRecord":private]=>
    array(1) {
      ["id"]=>
      int(1)
    }

#查询一列,返回数组
User::find()->select("id")->asArray()->all();
array(1) {
  [0]=>
  array(1) {
    ["id"]=>
    string(1) "1"
  }
}

#查询一列之和
User::find()->select("salary")->sum("salary");

2.3.查询多列数据

/*query查询*/

$query = (new yiidbQuery())
    ->select("id, name")
    ->from("user")
    ->limit(10);

/*ActiveRecord查询*/

User::find()->select("username,email")->one(); 
#返回结果是对象,如下:
object(commonmodelsUser)#116 (8) {
  ["_attributes":"yiidbBaseActiveRecord":private]=>
  array(2) {
    ["username"]=>
    string(4) "jack"
    ["email"]=>
    string(16) "986994@qq.com"
  }
获取数据为,$user->username, $user->email

2.4.查询多条记录:

/*返回所有记录*/
User::find()->all();
/*查询满足条件 [单个条件,多个条件] 的多条记录*/
User::find()->where(["sex" => "male"])->all(); 
/*统计查询,在查询后加count方法,统计查询结果中的记录数量*/
User::find()->count(); 
/*排序查询,根据id查询一条最新注册的用户记录*/
User::find()->orderby(["id" => SORT_DESC, "created_at" => SORT_DESC]); 

2.5.关联查询

/*包含中间表的1:n查询*/
public function getLectures()
{
    return $this->hasMany(VLecture::className(), ["section_id" => "id"])->viaTable("vw_section", ["course_id" => "id"]);
}

/* 1:n 查询*/
public function getTeachs(){
    return $this->hasMany(VCourseTeach::className(), ["course_id" => "id"]);
}

/* 1:1 查询*/
public function getCategory()
{
    return $this->hasOne(VCategory::className(), ["id" => "category_id"]);
}

2.6.DataProvider查询

这个查询比较重要,即在程序中,使用方式有两种:
其一是实例化一个ActiveDataProvider类;
其二是生成相关模型的search类,将它作为所有查询的入口;

public function getSupporters(){
    $dataProvider = new ActiveDataProvider([
       "query" =>VCrowdfundSupport::find()->where(["crowdfund_id" => $this->id]),
    ]);
    $dataProvider->sort = ["defaultOrder" => ["created_at" => SORT_DESC]];
    $dataProvider->pagination->pageSize = 9;
    return $dataProvider;
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。