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

在实际开发中,联表查询是很常见的,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方法

猜你喜欢

转载自www.cnblogs.com/hl540/p/9121390.html
今日推荐