laravel的多态关联--morphTo和morphMany
首先,文档里面讲述的不是特别详细,详细寻找查询流程没有过多介绍,只是介绍如何去定义,直接使用,导致很多该明白的东西,没有说明,下面详细看看这个多态关联
是怎么定义,使用,详细查询的。
先看文档介绍
多态关联允许一个模型在单个关联下属于多个不同模型。例如,假如你想要为产品和职工存储照片,使用多态关联,你可以在这两种场景下使用单个photos表,首先,让我们看看构建这种关联关系需要的表结构:
staff
id - integer
name - string products
id - integer
price - integer photos
id - integer
path - string
imageable_id - integer
imageable_type - string
两个重要的列需要注意的是photos表上的imageable_id和imageable_type。imageable_id列包含staff或product的ID值,而imageable_type列包含所属模型的类名。当访问imageable关联时,ORM根据imageable_type列来判断所属模型的类型并返回相应模型实例。
如何定义:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Photo extends Model{
/**
* 获取所有拥有的imageable模型
*/
public function imageable()
{
return $this->morphTo();
}
}
class Staff extends Model{
/**
* 获取所有职员照片
*/
public function photos()
{
return $this->morphMany('App\Photo', 'imageable');
}
}
class Product extends Model{
/**
* 获取所有产品照片
*/
public function photos()
{
return $this->morphMany('App\Photo', 'imageable');
}
}
在每个模型中 都这样定义一下,定义morpto方法的都是这个模型中,字段是带有imageable_id和imageable_type的。id就是其他关联到这个模型的id,type就是哪一个类,里面数据库怎么填呢,id,填3,imageable_type填 app\Product 就表示,这个图片是和产品表里面的id为3的那条数据关联,注意了!,这里后面type字段,类一定要加app\类,加app方可,不然这个类是找不到的,他是根据laravel的类机制来运行的。
那么现在怎么使用呢:
$product = App\Product::find(3); dd($product->photos);
这句话的意思就是,找产品表里id为3的那条数据,在到photo表里找imageable_id和imageable_type的值是什么,如果值为3和app\Product的数据,表明关联关系OK,否则就找不到
反其道而行之,可以直接使用主关联的模型,就是所谓的morphTo方法,这个是主关联,因为他直接关联2个表,就可以查看,这个模型,所拥有的产品和职员是哪些了。
$photo = App\Photo::find(3);
$imageable = $photo->imageable;
这个意思是,查看photo表里id为3的那条数据,看他的imageable_id和imageable_type是什么,如果是1和app\Product的话,就会去Product表里去找id为1的数据,然后显示出来了。没有数据就为空。如果是2和app\Staff的话,就回去Staff表里找id为2的数据,有则显示。
laravel的多态关联--morphTo和morphMany的更多相关文章
- Laravel 多态关联中利用关联表相关字段进行排序的问题
1 目标 1.1 在 Laravel 项目的开发中,多态的需求很常见,按多态关联进行排序的需求也是必须的. 1.2 请想像,我们有一个需求,荣誉栏目多态关联一个档案模型,要求在荣誉中按档案的推荐时间进 ...
- laravel 强大的关联模型
内容比较多,不总结了,直接看学院君的译文吧,已经写得很详细了 传送门:http://laravelacademy.org/post/6191.html PS1: laravel的关联模型并不是遍历一次 ...
- polymorphic-associations 多态关联实例 ruby on rails
这次做新项目的时候,把图片都放在了一个表里,其他表中不再存图片信息,通过多态关联建立表之间的关系. (1)新建picture表, component表不需要处理 class CreatePicture ...
- SQL反模式学习笔记7 多态关联
目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_T ...
- Laravel5.1 模型 --多态关联
什么是多态关联? 一个例子你就明白了:好比如说评论 它可以属于视频类 也可以属于文章类,当有个需求是 从评论表中取到视频类的数据,这就需要用到多态关联了. 简单的一句话总结:一张表对应两张表. 1 实 ...
- Laravel 多态关联使用的案例
1.实现的功能,:短信发送,需要签名和模板审核,审核结果要插进审核记录表 2,在signature(签名表模型)和 template(模板表模型)添加多态对应关系代码其实一样,代码如下: 审核记录表需 ...
- Laravel 多态关联中不能使用 has, whereHas
ghost commented on Apr 13, 2017 • edited by ghost i'm currently using this code in my own project m ...
- laravel 里面结合关联查询 的when()用法
Laravel 5.6 里面的when用法: $name = $request->get('name'); //活动标题 $start_time = $request->get('star ...
- laravel 中with关联查询限定查询字段
学习了下laravel5.6框架,果然很优雅,比如ActiveJieSuan model中作如下关联:(laravel模型关联关系可以查看https://laravelacademy.org/post ...
随机推荐
- File transfer in android with asmack and Openfire
http://harryjoy.com/2012/08/18/file-transfer-in-android-with-asmack-and-openfire/ http://www.javacod ...
- Simulate android behaviors on win32
To make debugging android games on win32 more convenience, we added some simulate actions to win32 p ...
- scrollLeft、offsetLeft、clientLeft、clientHeight详解
offsetLeft:Html元素相对于自己的offsetParent元素的位置 scrollLeft:返回和设置当前横向滚动务的坐标值 scrollLeft.offsetLeft.clientLef ...
- ios知识点
在controller中加载plist数据 1,设置属性NSArray 或可变数组NSMutableArray @property(nonatomic,strong)NSArray *message; ...
- 基于Selenium2+Java的UI自动化(3) - 页面元素定位
一.几种网页定位方式 webdriver的页面定位很灵活,提供了8种定位方式: 其中,常见的有三种:id .cssSelector .xpath: 一个元素如果存在 id 属性,则这个 id 的值,在 ...
- JavaScript 零散知识点1 (正则表达式+定时器+hover)
1.clear:both清楚浮动影响//css中 2.正则表达式 search方法 :指明是否存在相应的匹配,如找到一个返回一个整数值,表明这个匹配距离字符串开始的偏移位置,如果没有找到匹配返回-1f ...
- C#面试基础问题
传入某个属性的set方法的隐含参数的名称是什么? value,它的类型和属性所声名的类型相同. 如何在C#中实现继承? 在类名后加上一个冒号,再加上基类的名称. C#支持多重继承么? 不支持.可以用接 ...
- 查看源代码查找获取sd卡剩余容量的代码
下载android源码,找到app下的Settings应用源码,导入Settings项目(android项目源码) 查找“可用空间”得到 <string name="memory_av ...
- 小学英语课文朗读APP开发笔记(一):创建Win7虚拟机
1 缘起 以小米盒子为代表的OTT机顶盒.智能电视的快速普及,快速推动了Android技术在机顶盒.智能电视领域的普及.既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机 ...
- Oracle——事务(Transaction)
事务: 事务是指作为单个逻辑工作单元执行的一组相关操作. 这些操作要求全部完成或者全部不完成. 使用事务的原因:保证数据的安全有效. 事务的四个特点:(ACID) 1.原子性(Atomic):事务中所 ...