在实际开发中,联表查询是很常见的,yii提供联表查询的方式
关系型数据表:一对一关系,一对多关系
实例:
文章表和文章分类表
一个文章对应一个分类
一个分类可以对应多个文章
文章表:article
文章分类表:category
article.cate_id关联category.id
定义对应的数据模型
1 <?php 2 namespace app\models; 3 4 use yii\db\ActiveRecord; 5 6 /** 7 * 文章模型 8 */ 9 class Article extends ActiveRecord{ 10 11 /** 12 * 获取文章分类 13 * 一对一关系,一个文章对应一个分类 14 */ 15 public function getCategory(){ 16 // select * from article join category on category.id = article.cate_id where ... 17 $category = $this->hasOne(Category::className(),["id"=>"cate_id"])->asArray(); 18 return $category; 19 } 20 }
1 <?php 2 namespace app\models; 3 4 use yii\db\ActiveRecord; 5 /** 6 * 文章分类模型 7 */ 8 class Category extends ActiveRecord{ 9 10 /** 11 * 获取分类的文章 12 * 一对多关系 13 * 一个分类对应多个文章 14 */ 15 public function getArticles(){ 16 // select * from category join article on article.cate_id = category.id where ...; 17 $articles = $this->hasMany(Article::className(),["cate_id"=>"id"])->asArray(); 18 return $articles; 19 } 20 }
文章模型的方法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方法