zoukankan      html  css  js  c++  java
  • 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的数据,有则显示。

  • 相关阅读:
    心情日记:疯人疯语
    疾病研究:转载口服药物恢复了杜氏进行性肌营养不良患者缺失的蛋白
    报告论文:游程(行程)长度编码matlab(或者C++)实现
    技巧心得:没有 显示隐藏的文件和文件夹 选项
    视频教程:YUV420和RGB相互转换C++实现(二)
    应聘经历:网易公司 笔试
    视频教程:YUV和RGB相互转换MATLAB实现(一)
    读书札记:7天搞定C语言(一)
    嵌入式系统Linux内核开发工程师必须掌握的三十道题
    交流:IT学习大本营:“2×10+10:积分+资源分”大派送
  • 原文地址:https://www.cnblogs.com/huangshoushi/p/5877756.html
Copyright © 2011-2022 走看看