yii学习笔记(7),数据库操作,联表查询
在实际开发中,联表查询是很常见的,yii提供联表查询的方式
关系型数据表:一对一关系,一对多关系
实例:
文章表和文章分类表
一个文章对应一个分类
一个分类可以对应多个文章
文章表: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->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方法
yii学习笔记(7),数据库操作,联表查询的更多相关文章
- sql学习笔记(三)—— 联表查询
上篇写了一些sql查询的知识,这篇接着写一下有关联表查询的知识. 既然是联表查询,那肯定得多个表啊,所以,我们先创建一个教师表,表名为 teacher,并且向表中插入数据. 准备工作: 创建表语句: ...
- MyBatis学习存档(5)——联表查询
之前的数据库操作都是基于一张表进行操作的,若一次查询涉及到多张表,那该如何进行操作呢? 首先明确联表查询的几个关系,大体可以分为一对一和一对多这两种情况,接下来对这两种情况进行分析: 一.建立表.添加 ...
- mysql数据库之联表查询
表准备: 这次我们用到5张表: class表: student表: score表: course表: teacher表: 表结构模型: 我们针对以下需求分析联表查询: 1.查询所有的课程的名称以及对应 ...
- ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )
//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: publ ...
- Symfony2学习笔记之数据库操作
数据库和Doctrine让我们来面对这个对于任何应用程序来说最为普遍最具挑战性的任务,从数据库中读取和持久化数据信息.幸运的是,Symfony和Doctrine进行了集成,Doctrine类库全部目标 ...
- Laravel 学习笔记之数据库操作——Eloquent ORM
1. 时间戳 默认情况下在使用ORM操作数据库进行添加.修改数据时, created_at 和 updated_at列会自动存在于数据表中,并显示的是 ‘2017’格式,如果想以 Unix时间戳格式存 ...
- ThinkPHP 学习笔记 ( 四 ) 数据库操作之关联模型 ( RelationMondel ) 和高级模型 ( AdvModel )
一.关联模型 ( RelationMondel ) 1.数据查询 ① HAS_ONE 查询 创建两张数据表评论表和文章表: tpk_comment , tpk_article .评论和文章的对应关系为 ...
- Mysql数据库学习笔记之数据库索引(index)
什么是索引: SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间. 聚集索引:该索引中键值的逻辑顺序决定了表中相应行的物 ...
- MongoDB学习笔记:MongoDB 数据库的命名、设计规范
MongoDB学习笔记:MongoDB 数据库的命名.设计规范 第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...
随机推荐
- c++ inline 的位置不当导致的 无法解析的外部符号
这几天编写代码碰到 无法解析的外部符号 visual studio. 在类中 inline 修饰符应该放在类函数定义的时候而不是声明的地方 即 // test.h 头文件 class A { publ ...
- 调用Linux的busybox,通过linux命令来获取AndRoidIP
//根据busybox获取本地Mac public static String getLocalMacAddressFromBusybox(){ String result = "" ...
- WCF安全 z
WCF custom authentication using ServiceCredentials The generally accepted way of authenticating a us ...
- shell 脚本中后台执行命令 &
最近遇到一个问题, 执行脚本,脚本调用 一个命令,命令(deamon)是一个守护进程,为了调试,取消了守护进程模式.导致命令后边的其他命令(echo "456")都无法执行. de ...
- ZT 怎么样才算熟悉设计模式? [问题点数:40分,结帖人jiaoyun007]
http://bbs.csdn.net/topics/390448668?page=1#post-394406161 近日面试,因为个人简历里有“熟悉设计模式”这句话,面试官边侃侃发问了:什么是装饰模 ...
- JAVA串口开发帮助类分享-及写在马年末
摘要: 在系统集成开发过程中,存在着各式的传输途径,其中串口经常因其安全性高获得了数据安全传输的重用,通过串口传输可以从硬件上保证数据传输的单向性,这是其它介质所不具备的物理条件.下面我就串口java ...
- luogu P1642 规划
嘟嘟嘟 看到最后让求一个比值,应该得往01规划上去想.令x = ∑v[i] / ∑c[i],则x * ∑c[i] = ∑v[i], ∑(v[i] - x * c[i]) = 0. 于是可以二分x(注意 ...
- PHP-------- JQUERY方式
JQUERY方式 1.根据ID取元素,Jquery对象 var div = $("#one"); 2.根据class取 var div = $(".test&quo ...
- SSH 与 SSL
关于 ssh 有人已经总结得非常好了,这里推荐大家看下 阮一峰 写的 ssh原理与应用 写得简单易懂,非常赞. 关于 ssl 这里有一篇博文写得也不错,ssl协议详解 好了,那 ssh 和 ssl ...
- MyBatis动态sql语句归纳
1.删除数据(假删除)并修改时间 <!--根据id删除学生信息(多条)--> <update id="updateStuStatus" parameterType ...