繁体   English   中英

Laravel 过滤一个 hasMany 关系

[英]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()中的内容并不重要,它只返回truefalse

当我执行以下操作时,它会起作用:

$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);
});

在您的第二个示例中,您正在执行以下伪代码:

  1. 获取每个用户的所有纪念日
  2. 过滤匹配$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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM