首先,文档里面讲述的不是特别详细,详细寻找查询流程没有过多介绍,只是介绍如何去定义,直接使用,导致很多该明白的东西,没有说明,下面详细看看这个多态关联
是怎么定义,使用,详细查询的。
先看文档介绍
多态关联允许一个模型在单个关联下属于多个不同模型。例如,假如你想要为产品和职工存储照片,使用多态关联,你可以在这两种场景下使用单个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的数据,有则显示。