yii学习笔记(7),数据库操作,联表查询

时间:2023-03-08 18:16:19

在实际开发中,联表查询是很常见的,yii提供联表查询的方式

关系型数据表:一对一关系,一对多关系

实例:

文章表和文章分类表

一个文章对应一个分类

一个分类可以对应多个文章

yii学习笔记(7),数据库操作,联表查询

文章表:article

文章分类表:category

article.cate_id关联category.id

定义对应的数据模型

 <?php
namespace app\models; use yii\db\ActiveRecord; /**
* 文章模型
*/
class Article extends ActiveRecord{ /**
* 获取文章分类
* 一对一关系,一个文章对应一个分类
*/
public function getCategory(){
// select * from article join category on category.id = article.cate_id where ...
$category = $this->hasOne(Category::className(),["id"=>"cate_id"])->asArray();
return $category;
}
}
 <?php
namespace app\models; use yii\db\ActiveRecord;
/**
* 文章分类模型
*/
class Category extends ActiveRecord{ /**
* 获取分类的文章
* 一对多关系
* 一个分类对应多个文章
*/
public function getArticles(){
// select * from category join article on article.cate_id = category.id where ...;
$articles = $this->hasMany(Article::className(),["cate_id"=>"id"])->asArray();
return $articles;
}
}

文章模型的方法getCategory,用来获取当前实例文章分类(一对一)

文章分类模型的getArticles,用来获取当前实例分类的所有文章(一对多)

这两个方法的实现大致相同,区别在关联时使用的方法

$this->hasOne(关联表对应的模型类,关联条件),结果对应一个实例

$this->hasMany(关联表对应的模型类,关联条件),结果对应多个实例

 

控制器调用

// 查询单个文章的分类
$article = Article::findOne(1);// 获取文章实例
$category = $article->category;// 获取文章分类
dd($category);

这里可以看到获取了文章实例的一个属性category

但是我们并没有定义这个属性,访问这个属性时,框架会去调用对应的get方法对这个属性赋值

在对属性赋值时,框架会识别属性的对应关系来自动加上all()或者one()方法来获取得到最终结果

连贯操作

$articles = Article::find()->where(["id"=>1])->with("category")->asArray()->all();

按指定条件查询文章记录的属性和管理属性,注意with()这个方法

这里查询条件为id=1,连同管理属性category一起查询

前提是必须定义category的获取方法,这里是文章类的getCategory方法