如何在 Laravel Eloquent 上过滤相关模型

Posted

技术标签:

【中文标题】如何在 Laravel Eloquent 上过滤相关模型【英文标题】:How to filter the related model on Laravel Eloquent 【发布时间】:2021-09-18 15:28:19 【问题描述】:

我有一个与 Booking 有 hasMany 关系的 Affiliate 模型。

现在我想将预订日期介于 2 个给定日期之间的所有关联公司及其预订带入,并且只带上符合该限制的预订。

现在我明白了

$affiliate = Affiliate::whereHas('bookings', static function (Builder $builder) use ($params) 
                $builder->whereOrAny('date','>=', $params['dateFrom']);
                $builder->whereOrAny('date','<=', $params['dateTo']);
            )->with('bookings');

这很好地过滤了包含在参数中的日期之间的预订的关联公司,但我还想过滤预订,因此生成的 $affiliates->bookings 仅包含具有这些给定日期之间的日期

例如,我有这样的东西

$affiliates = [
        
            name : 'Example 1',
            bookings : [
                
                    'date' : 2020-06-01
                ,
                
                    'date' : 2019-05-01
                ,
                
                    'date' : 2019-04-01
                
            ]   
        ,
        
            name : 'Example 2',
            bookings : [
                
                    'date' : 2020-06-01
                ,
                
                    'date' : 2020-05-01
                ,
                
                    'date' : 2020-04-01
                
            ]   
        ,
        
            name : 'Example 3',
            bookings : [
                
                    'date' : 2019-06-01
                ,
                
                    'date' : 2020-05-01
                ,
                
                    'date' : 2020-04-01
                
            ]   
        
    ]

如果我使用 fromDate = 2019-01-01 和 toDate = 2019-31-12(2019 年的任何日期)进行过滤,则会返回类似这样的内容

    $affiliatesFiltered = [
        
            name : 'Example 1',
            bookings : [
                
                    'date' : 2019-05-01
                ,
                
                    'date' : 2019-04-01
                
            ]   
        ,
        
            name : 'Example 3',
            bookings : [
                
                    'date' : 2019-06-01
                ,
            ]   
        
    ]

正如你所看到的,我不仅需要过滤附属公司,只带在这些日期之间有预订的人,而且只带这些日期之间的预订,我希望你们能帮助我

【问题讨论】:

日期 beetwen $builder->where([['date','>=', $params['dateFrom']], ['date',' with 中应用whereOrAnywhereHas 相同 或者你可以看看这个***.com/a/29594039/8012110 【参考方案1】:

好的,感谢一些 cmets,我得到了一个解决方案,以防有人想知道如何做到这一点。它会是这样的

$affiliate->with(['bookings' => function($query) use($params) 
    $query->where('date','>=', $params['dateFrom'])
        ->where('date','<=', $params['dateTo'])    
        ;
])

它就像一个魅力:) 非常感谢!

【讨论】:

【参考方案2】:

假设您的 bookings 模型还具有 dateFromdateTo 属性,这应该也适用于您过滤您的关系:

...
->with(['bookings' => function ($q) use ($params)
$q->where(
[
    ['bookings.dateFrom','>=',$params['dateFrom']],
    ['bookings.dateTo','<=',$params['dateTo']],
]
);

]);

【讨论】:

以上是关于如何在 Laravel Eloquent 上过滤相关模型的主要内容,如果未能解决你的问题,请参考以下文章

Laravel cviebrock/eloquent-sluggable 将 @ 作为前缀或在路由中过滤它

Laravel 5 / Eloquent - 对属于多的关系进行查询过滤

Laravel 5 - Eloquent:过滤多种关系的简单方法

Laravel Eloquent - 使用过滤数据获取嵌套关系

Laravel (8.x) 这个多对多过滤问题有更好的 Eloquent 查询吗?

如何在 Eloquent/Laravel 上查询子查询