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_idimageable_typeimageable_id列包含staffproduct的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_idimageable_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_idimageable_type的值是什么,如果值为3和app\Product的数据,表明关联关系OK,否则就找不到

反其道而行之,可以直接使用主关联的模型,就是所谓的morphTo方法,这个是主关联,因为他直接关联2个表,就可以查看,这个模型,所拥有的产品和职员是哪些了。

$photo = App\Photo::find(3);
$imageable = $photo->imageable;

这个意思是,查看photo表里id为3的那条数据,看他的imageable_idimageable_type是什么,如果是1和app\Product的话,就会去Product表里去找id为1的数据,然后显示出来了。没有数据就为空。如果是2和app\Staff的话,就回去Staff表里找id为2的数据,有则显示。

时间: 2024-11-05 14:53:13

laravel的多态关联--morphTo和morphMany的相关文章

SQL反模式学习笔记7 多态关联

2014-10-13 09:50:54 目标:引用多个父表 反模式:使用多用途外键.这种设计也叫做多态关联,或者杂乱关联. 多态关联和EAV有着相似的特征:元数据对象的名字是存储在字符串中的. 在多态关联中,父表的名字是存储在Issue_Type单独一列中,有时候这样的设计被称作:混合数据与原数据. 查询示例: select * from A as a               left join B as b on a.xId=b.Id and a.xType='b'            

逻辑数据库设计 - 多态关联

多态关联 先说明什么是多态关联. 假设我们有一张地址表,其中的地址可能是对于User中的,也可能是对于Orders中的. 以上,只是举个例子,实际的例子还有很多,比如我们要设计一个内容管理系统(CMS),我们的CMS有一个文章表,一个软件表.还要求支持评论,那么我们的评论表的Id是引用文章表还是引用软件表呢? 对于以上例子的缺点,貌似书本上有故意为此多态关联的模式走软的嫌疑.缺点不说了,主要是查询麻烦,其次不能够支持外键约束. 解决方案 交叉表 对于这种需要外键引用为多个表的情况,可以建立一张交

Laravel 多态关联使用的案例

1.实现的功能,:短信发送,需要签名和模板审核,审核结果要插进审核记录表 2,在signature(签名表模型)和 template(模板表模型)添加多态对应关系代码其实一样,代码如下: 审核记录表需要有:auditable_type, 用来保存所属模型的类名.该字段可默认插入值,也可自定义 A:在审核记录表添加 public function auditable()     {         return $this->morphTo();     } B:在签名表加 public func

laravel 中with关联查询限定查询字段

学习了下laravel5.6框架,果然很优雅,比如ActiveJieSuan model中作如下关联:(laravel模型关联关系可以查看https://laravelacademy.org/post/8867.html) 只需在ActiveJieSuan 模型中设定 protected $with = ['user','actice']; 那么查询ActiveJieSuan就能自动关联上users,actice_contents表. 如果要限定关联查询的字段,可以如下写法: ActiveJie

一些实用的 Laravel 小技巧

Laravel 中一些常用的小技巧,说不定你就用上了. 1.侧栏 网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与视图有关的数据的话,未免太冗余了.所以最佳的做法是:新建一个widgets视图文件夹,再利用Laravel 的ViewComposers单独为侧栏绑定数据,这样侧栏就可以随便引入而不用关心数据是否绑定啦. 举个栗子,拿最常用的分类侧栏来说,在resources/views/widgets下新建你的分

深入理解 Laravel Eloquent(三)——模型间关系(关联)

Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了).所谓 "对象",就是本文所说的 "模型(Model)":对象关系映射,即为模型间关系.中文文档: http://laravel-china.org/docs/eloquent#relationships 下

laravel Eloquent操作

基本用法 我们先从建立一个 Eloquent 模型开始.模型通常放在 app 目录下,但是您可以将它们放在任何地方,只要能通过 composer.json 自动载入.所有的 Eloquent 模型都继承于Illuminate\Database\Eloquent\Model . 定义一个 Eloquent 模型 class User extends Model {} 你也可以通过 make:model 命令自动生成 Eloquent 模型: php artisan make:model User

Laravel之Eloquent ORM

一.ORM编程思想 1.1 Active Record 设计模式 Active Record 是一种数据访问设计模式,它可以帮助你实现数据对象Object到关系数据库的映射.应用Active Record时,每一个类的实例对象唯一对应一个数据库表的一行(一对一关系).你只需继承一个abstract Active Record 类就可以使用该设计模式访问数据库,其最大的好处是使用非常简单 1.2 调试工具 Laravel Debugbar Installation: composer requir

用 mongodb 储存多态消息/提醒类数据(转)

原文:http://codecampo.com/topics/66 前天看到 javaeye 计划采用mongoDB实现网站全站消息系统,很有同感,mongodb 很适合储存消息类数据.之前讨论了如何构建一个微博型广播,这次讨论一下怎么储存消息/提醒类数据. 下面的内容不涉及关于海量数据储存的问题,只讨论数据模式. 1. 需求 消息/提醒类数据有不少例子,比如豆瓣的好友广播(我说.电影/书籍已读状态.网址推荐等),Twitter 的推信息 Tweet,SNS 的好友状态. 这类信息的一个特点是模