Laravel hasMany 与 where 在多态关系中

Posted

技术标签:

【中文标题】Laravel hasMany 与 where 在多态关系中【英文标题】:Laravel hasMany with where in a Polymorphic relationship 【发布时间】:2014-12-13 13:27:01 【问题描述】:

我有 3 张桌子,汽车、公寓和商店。每张桌子都有照片。照片存储在数据库中。我只想为照片使用一张表,我不想为每个 Cars、Flats 和 Shops 创建 Photos 表。

照片表结构是这样的;

| id |           photo_url        | type  | destination_id |
------------------------------------------------------------
  1  |   http://example.com/1.jpg | Cars  |      1         |
  2  |   http://example.com/2.jpg | Flats |      1         |
  3  |   http://example.com/3.jpg | Flats |      2         |
  4  |   http://example.com/4.jpg | Shops |      1         |
  5  |   http://example.com/3.jpg | Shops |      2         |

我需要在 Shops、Flats 和 Cars 模型类中定义 hasMany 与类型的关系。

这样做的正确方法是什么?

【问题讨论】:

【参考方案1】:

您可以将关系对象视为查询,因为您可以使用它们调用查询构建函数。下面的示例应该让您朝着正确的方向前进。

class Cars extends Eloquent

    function photos()
    
        return $this->hasMany('Photo')->where('photos.type', '=', 'Cars');
    

【讨论】:

非常感谢,我需要打电话给Order::with('orderItems')->where('orderItems.type',1)->with('orderItems.orderItemOptions', 'orderItems.orderMenuItems')->first(),但范围不能那样工作 哪种方法最好,第一种方法还是第二种方法?? 有什么方法可以为此传递参数吗?在 where 子句中使用参数? @Logan 我们如何使用WITH function在这个函数中传递一个参数,你能解释一下吗? 如果需要给"with"添加条件,用with((['Model' => function ($query) $query->where('title', 'like', '%第一个%'); ]))【参考方案2】:

您可以使用 Eloquent 的Polymorphic relationships。 Laravel 文档中的示例实际上展示了为多个模型设置一个通用图像表,因此这应该为您指明正确的方向。在您的情况下,您的模型看起来像这样:

class Photo extends Eloquent 

    public function imageable()
    
        return $this->morphTo();
    



class Car extends Eloquent 

    public function photos()
    
        return $this->morphMany('Photo', 'imageable');
    



class Flat extends Eloquent 

    public function photos()
    
        return $this->morphMany('Photo', 'imageable');
    



class Shop extends Eloquent 

    public function photos()
    
        return $this->morphMany('Photo', 'imageable');
    


您可以访问照片,比如给定的Flat,如下所示:

Flat::find($id)->photos;

为此,您还需要在 photos 表中添加 2 个额外的列:

imageable_id: integer  <-- This will be the ID of the model
imageable_type: string <-- This will be the model's class name (Car/Flat/Shop)

【讨论】:

以上是关于Laravel hasMany 与 where 在多态关系中的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中通过 ajax 加载更雄辩的 hasMany 关系查询?

Laravel 关系使用 Where

Laravel Eloquent 关系有很多错误:在 where 上使用时调用未定义的方法

如何在 Laravel 8 中获取与 json 有一个 hasMany 关系的表的所有模型?

laravel where 结果很奇怪

Laravel同步hasMany与belongsTo数组