[英]Laravel filtering a hasMany relation
首先介绍我的问题的背景。 一个用户有很多contacts
,一个contact
有很多anniversaries
。 我想过滤即将到来的周年纪念日。 到目前为止我有这个:
$filtered = auth()->user()->contacts()->get()->each(function ($contact) {
$contact->anniversaries->filter(function ($anniversary) {
// return true or false based on a method on the anniversary model
return $anniversary->method() == true;
});
});
但这只会返回所有联系人(显然)及其所有周年纪念日,我希望在调用$anniversary->method()
时排除那些错误的联系人。
$anniversary->method()
中的内容并不重要,它只返回true
或false
。
当我执行以下操作时,它会起作用:
$collection = auth()->user()->anniversaries()->get();
$filtered = $collection->filter(function ($anniversary) {
return $anniversary->method() == true;
});
我只得到$anniversary->method()
确实为true
的周年纪念日。
我的问题主要是,为什么会发生这种情况,我只是想了解它,而不是那么需要关于如何使其工作的答案。 提前感谢您的任何见解!
在第一个示例中,您只过滤每个联系人的anniversaries
。 您没有直接过滤contacts
。
$filtered = auth()->user()->contacts()->get()->each(function ($contact) {
// You are filtering only the anniversaries of each contact
$anniversaries = $contact->anniversaries->filter(function ($anniversary) {
return $anniversary->method() == true;
});
// over here you should get the same as in your second example
dd($anniversaries);
});
在您的第二个示例中,您正在执行以下伪代码:
$anniversary->method() === true
的纪念日要在第一个示例中获得相同的结果,您必须结合使用filter
和->count()
$filtered = auth()->user()->contacts()->get()->filter(function ($contact) {
$filteredByMethod = $contact->anniversaries->filter(function ($anniversary) {
// return true or false based on a method on the anniversary model
return $anniversary->method() == true;
});
return $filteredByMethod->count() > 0;
});
哪个性能更高超出了这个答案的 scope。
Laravel's collections
中的方法filter
需要返回一个truthy
值作为过滤依据。 由于您的method
返回true or false
,您可以直接调用该方法而无需与true
进行比较:
$collection = auth()->user()->anniversaries()->get();
$filtered = $collection->filter(function ($anniversary) {
return $anniversary->method();
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.