php - Laravel 过滤 hasMany 关系
问题描述
首先是我的问题的背景。用户 hasManycontacts
和contact
hasMany 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
or 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
with的组合->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;
});
哪个性能更高超出了此答案的范围。
小建议
filter
from方法Laravel's collections
需要返回一个truthy
要过滤的值。由于您的method
回报true or false
,您可以直接调用该方法而无需与true
:
$collection = auth()->user()->anniversaries()->get();
$filtered = $collection->filter(function ($anniversary) {
return $anniversary->method();
});
推荐阅读
- regex - 获取正则表达式以匹配同一模式的多个实例
- java - c++ 是否提供与 java 中的 threadLocal 提供相同支持的任何内置类?
- c - OpenMP 线程,如何正确使用 omp atomic 子句?
- r - 将两个图合并为一个(添加边)R igraph
- node.js - 在 React 中服务不同的页面是如何工作的?
- vue.js - 在 Vue.js 应用程序中正确设置环境变量
- javascript - 量角器承诺调用如何执行函数调用
- proxy - Dante Socks5 代理服务器无法启动
- mysql - MYSQL 限制使用 CREATE、DROP、ALTER
- html - 图片来源不改变图像