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方法

转载于:https://www.cnblogs.com/hl540/p/9121390.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值