具有多态关系的Laravel关系结构

时间:2016-10-13 16:49:20

标签: mysql laravel eloquent

我有几张桌子......

FreeLook    
  - id

SignVendor
  - id

PaintVendor
  - id

VendorJob
  - vendor_id
  - vendor_type
  - free_look_id
  - quote_id

Quote
  - id

当为PaintVendor选择SignVendorFreeLook时,将创建VendorJob并且它具有多态关系,以便我可以使用一个表SignVendorPaintVendor个职位所以,基本上,我希望能够做到这一点......

FreeLook::find(1)->signVendorJob // gets the sign vendor job from VendorJob for that freelook

在这里,我不能使用belongsTo关系,因为我无法区分查询中的符号或绘制供应商(或者至少我不知道某种方式)

FreeLook::find(1)->signVendor // gets the sign vendor for that freelook

问题是我通过VendorJob获得了标志供应商,而Laravel没有hasOneThrough

FreeLook::find(1)->signVendor->quote // gets the sign vendor quote from VendorJob for that freelook

由于SignVendor可以有多个Quote,我只想获得与FreeLookVendorJob

相关的报价

我是否需要为所有这些编写自定义MySQL查询,或者我是在过度复杂化,还是只是遗漏了什么?

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:0)

您将使用doc.s

中提到的morph关系

所以在VendorJob模型中

// the morph relation 
public function vendorable()
{
    return $this->morphTo();
}

// the quote relation
public function quote()
{
     return $this->hasOne('App\Quote');
}

并在PaintVendor模型中

 public function paintVendor()
{
    return $this->morphMany('App\VendorJob', 'vendorable');
}

SignVendor相同。 现在FreeLook::find(1)->signVendor将返回所有signVendor条记录的列表,因此您必须像以下一样循环它们:

foreach(FreeLook::find(1)->signVendor as $vendor)
    {
        // fetching the quote of every signVendor related to FreeLook num. 1
        $vendor->quote;
    }

我希望这会对你有所帮助。