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 字符(空字符),这个字符标识建的结尾 . 和 $ ...
随机推荐
- golang闭包
http://blog.51cto.com/speakingbaicai/1703229 https://www.jianshu.com/p/fa21e6fada70 所谓闭包就是一个函数" ...
- Linux文件系统的实现 ZZ
作者:Vamei 出处:http://www.cnblogs.com/vamei Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状结构来组织文件.树的顶端为根目录(/ ...
- T-SQL语法学习一(持续更新)
T-SQL语法学习(一) 第一节 不常用语句 不常用语句-指的是一些不常用的查询语句,不针对业务数据查询 SET STATISTICS IO ON(用于查询逻辑读取次数,物理读取次数) 图片 sele ...
- 为某个云服务设置RVIP
获取所有Azure(云)服务Get-AzureService #查看某个云服务的LocationGet-AzureService -ServiceName tests |select location ...
- npm install warning: no description; no repository field
npm install 报错:warning no description; no repository field 开始以为必须npm init,npm init在git bash(win7)里,还 ...
- The categories of Reinforcement Learning 强化学习分类
RL分为三大类: (1)通过行为的价值来选取特定行为的方法,具体 包括使用表格学习的 q learning, sarsa, 使用神经网络学习的 deep q network: (2)直接输出行为的 p ...
- Manifold Learning: ISOMAP
转:http://hi.baidu.com/chb_seaok/item/faa54786a3ddd1d7d1f8cd0b 在常见的降维方法中,PCA和LDA是最为常用的两种降维方法.PCA是一种无监 ...
- 「C语言」在Windows平台搭建C语言开发环境的多种方式
新接触C语言,如何在Windows下进行C语言开发环境的搭建值得思考并整理. 以下多种开发方式择一即可(DEV C++无须环境准备). 注:本文知识来源于 Windows 平台搭建C语言集成开发环境 ...
- [零基础学pythyon]安装python编程环境
不论什么高级语言都是须要一个自己的编程环境的,这就好比写字一样,须要有纸和笔,在计算机上写东西.也须要有文字处理软件,比方各种名称的OFFICE.笔和纸以及office软件,就是写东西的硬件或软件.总 ...
- 2014年百度之星资格赛第一题Energy Conversion
Problem Description 魔法师百小度也有遇到难题的时候-- 如今.百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这样的魔法文字须要耗费大量的能量和大量的脑力. 过了许久 ...