【问题标题】:How to filter the related model on Laravel Eloquent如何在 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 中应用whereOrAny 与whereHas 相同
  • 或者你可以看看这个stackoverflow.com/a/29594039/8012110

标签: php laravel eloquent orm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    }]);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 2017-02-04
      • 2015-04-21
      • 2019-02-03
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      相关资源
      最近更新 更多