如何在 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
中应用whereOrAny
与whereHas
相同
或者你可以看看这个***.com/a/29594039/8012110
【参考方案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']],
]
);
]);
【讨论】:
以上是关于如何在 Laravel Eloquent 上过滤相关模型的主要内容,如果未能解决你的问题,请参考以下文章
Laravel cviebrock/eloquent-sluggable 将 @ 作为前缀或在路由中过滤它
Laravel 5 / Eloquent - 对属于多的关系进行查询过滤
Laravel 5 - Eloquent:过滤多种关系的简单方法
Laravel Eloquent - 使用过滤数据获取嵌套关系