Eloquent ORM 之关联查询
小伙伴们好,本文是在我的前一篇随笔的基础上完成的,还没有浏览的同学,请移尊驾哦 Eloquent ORM学习笔记。
前一篇文章用到了leftJoin方法,其实Eloquent对于模块之间的关联查询有自己封装,接下来我们就一起研究Eloquent的关联是如何应用的。
1.创建Models
前一篇文章创建了UserModel,其实对于users_ext也可以创建一个Model: UserExtModel.php
<?php
class UserExtModel extends \Eloquent {
protected $table = 'users_ext';
protected $primaryKey = 'iAutoId';
protected $connection = 'user';
public function user() {
return $this->belongsTo('UserModel','iUserID','iAutoId');
}
}
2.建立关联
修改UserModel.php,在文件中添加和users_ext的一对一关联。
<?php
class UserModel extends \Eloquent {
protected $table = 'users';
protected $primaryKey = 'iAutoId';
protected $connection = 'user';
public function userExt(){
return $this->hasOne('UserExtModel','iUserID','iAutoId');
}
}
3.关联查询
(1)一对一关联:
上面两个Models利用hasOne()和belongsTo()方法建立的关联模型正是“一对一”模型,现在就可以做出简单的查询:
<?php
class HomeController extends BaseController {
public function getUsers(){
$resData = UserModel::find(1)->userExt->toArray();
var_dump($resData);
exit();
}
}
以上查询相当于sql语句:
SELECT
users_ext.*
FROM
users
LEFT JOIN users_ext ON users.iAutoId = users_ext.iUserID
WHERE
users_ext.iUserID = 1
(2)一对多关联:
将UserModel模型中hasOne()改为hasMany(),这样就建立了"一对多"的关联模型,现在可以做以下简单查询:
<?php
class HomeController extends BaseController {
public function getUsers(){
$resData = UserModel::find(1)->userExt()->where('sSex','=',1)->get()->toArray();
var_dump($resData);
exit();
}
}
以上查询相当于sql语句:
SELECT
users_ext.*
FROM
users
LEFT JOIN users_ext ON users.iAutoId = users_ext.iUserID
WHERE
users.iAutoId = 1
AND users_ext.sSex = 1
(3)多对多关联:
这个模型相对复杂,就以用户和角色的关系来说明。需要另外创建roles和user_role两张表,并初始化:
CREATE TABLE
IF NOT EXISTS roles (
iAutoId INT (11) auto_increment,
sRoleName VARCHAR (20),
PRIMARY KEY (iAutoId)
) ENGINE = INNODB DEFAULT CHARSET = utf8 auto_increment = 1; INSERT INTO roles (sRoleName)
VALUES
('admin'),
('root'); CREATE TABLE
IF NOT EXISTS user_role (
iAutoId INT (11) auto_increment,
iUserID INT (11),
iRoleID INT (11),
PRIMARY KEY (iAutoId)
) ENGINE = INNODB DEFAULT CHARSET = utf8 auto_increment = 1; INSERT INTO user_role (iUserID, iRoleID)
VALUES
(1, 1),
(1, 2),
(2, 1),
(3, 2),
(3, 1);
紧接着就可以建立RoleModel了:
<?php
class RoleModel extends \Eloquent {
protected $table = 'roles';
protected $primaryKey = 'iAutoId';
protected $connection = 'user';
}
然后在UserModel中创建“多对多”关联关系:
<?php
class UserModel extends \Eloquent {
protected $table = 'users';
protected $primaryKey = 'iAutoId';
protected $connection = 'user';
public function roles(){
return $this->belongsToMany('RoleModel','user_role','iUserID','iRoleID');
}
}
接下来就实现查询了:
<?php
class HomeController extends BaseController {
public function getUsers(){
$resData = UserModel::find(1)->roles;
var_dump($resData->toArray());
exit();
}
}
以上查询结果为:

好吧,这里只是简单学习了下,还有更复杂的需要小伙伴们自己查看API
Eloquent ORM 之关联查询的更多相关文章
- laravel Eloquent ORM联合查询出现Class not found,就算在Moel中存在这个类
今天发现一个坑,在处理Eloquent ORM的联合查询时,一直报错Class 'AdminGroup' not found ,可是我的项目中明明存在这个类,如下 这是我的模型类: 它们的控制器方法: ...
- beego中orm关联查询使用解析
这两天在学习beego框架,之前学习的时候遗漏了很多东西,比如orm.缓存.应用监控.模板处理等,这里将通过实例记录下如何使用beego自带的orm进行关联查询操作. 首先说明下,beego的orm有 ...
- DB门面,查询构建器,Eloquent ORM三者的CURD
一.DB门面 1.insert DB::insert('insert into table(`name`) value(?)', ['test']); 2.update DB::update('upd ...
- Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理
找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:
- Laravel Eloquent ORM
Eloquent ORM 简介 基本用法 集体赋值 插入.更新.删除 软删除 时间戳 查询范围 关系 查询关系 预先加载 插入相关模型 触发父模型时间戳 与数据透视表工作 集合 访问器和调整器 日期调 ...
- Eloquent ORM 学习笔记
最近在学习Laravel,觉得ORM功能很强大,我这里只是简单探索了一点,如果有更好的笔记,还请分享. 因为重点在于Eloquent ORM,所以路由设置,控制器就不详细描述了,这里直接进入Model ...
- orm获取关联表里的属性值
ORM——关系对象模型 laravel中的Eloquent ORM用于和数据表互动,其中每个数据库表会和一个对应的「模型」互动,想要了解请查看官方文档或自行百度.获取关联表里的属性值代码如下: /** ...
- 基于EF的数据外键关联查询
现在很多ORM不自带外键关联的实体查询,比如我查询用户,用时将关联的角色信息查询出来,那么就要进行2次查询,很麻烦.而我现在要做的就是基于EF的外键关联查询.很方便的. 首先,创建基础查询的BaseS ...
- [转]Laravel 4之Eloquent ORM
Laravel 4之Eloquent ORM http://dingjiannan.com/2013/laravel-eloquent/ 定义Eloquent模型 模型通常放在app/models目录 ...
随机推荐
- Excel Aspose.Cells 设置单元格格式 为数字
Workbook workbook = new Workbook(); //工作簿 Worksheet sheet = workbook.Worksheets[]; //工作表 sheet.Cells ...
- DotNetNuke-DNN Module模块引用自定义CSS或者JS文件
当新增一个module时,有时会引用自定义的或者第三方CSS.JS文件. 1.添加自定义的CSS时,可以直接在module的根目录下添加module.css,然后框架会自动加载此CSS: 2.这个比较 ...
- Array类型(二)
1.concat()方法可以基于当前数组中的所有项创建一个新数组. 先创建当前数组的一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组. var colors = ["r ...
- [XMPP]iOS聊天软件学习笔记[三]
今天做了好友界面,其实xmpp内部已经写好很多扩展模块,所以使用起来还是很方便的 开发时间:五天(工作时间) 开发工具:xcode6 开发平台:iOS8 XMPP框架:XMPPFramework gi ...
- class A<T>where T
where表明了对类型变量T的约束关系.where T: A表示类型变量是继承于A的,或者是A本身.where T:new()指明了创建T的实例时应该使用的构造函数.
- js去除左右空格
replace方法去掉字符串的空格 //去左空格; s=s.replace(/(^\s*)/g, ""); //去右空格; s= s.replace(/(\s*$)/g, &qu ...
- STM32工程中出现 error: A1163E: Unknown opcode R0, , expecting opcode or Macro错误分析及处理
最近测试以前的一个程序,一般都是打开以前写的程序修改参数直接测试 但是发现以前的编译后出现错误. 奇怪了,以前的出现都是调试好了的啊,一般都是没有错误的,迅速找问题 跳转到错误代码行 代码区域 Hea ...
- 关于css浮动的一些总结
首先给浮动一个定义吧 浮动可以理解为让某个div元素脱离标准流,漂浮在标准流之上,和标准流不是一个层次. 从测试中来看 元素之间的浮动关系是根据上一个元素来判断的如果上一个元素是浮动的它会跟在浮动元素 ...
- 安装GeoIP数据库
1.安装GeoIP数据库 cd /usr/local/logstash/etc curl -O "http://geolite.maxmind.com/download/geoip/data ...
- 2014.8.3情人节欢乐赛【Benny的农场】
Benny的农场 (farm.pas/.c/.cpp) 时间限制:1s.空间限制:128MB 题目描述: Benny有一片农田需要灌溉.农田的形状为矩形,并被分为许多小块.每一块中都有一些水管.共有1 ...