微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

检查该元素在集合中依次出现

如何解决检查该元素在集合中依次出现

我有一个通过 hasMany 关系从数据库返回的集合。

$items = collect([
    [
        'ref' => 'efaef954','children' => collect([
            [
                'ref' => 'wetk4','order' => 1,],[
                'ref' => 'wetk5','order' => 2,[
                'ref' => 'wetk6','order' => 3,]),[
        'ref' => 'efgjlf954','children' => collect([
            [
                'ref' => 'wetk5',[
                'ref' => 'wetk4',]);

$items-collection 可以包含任意数量的带有子项的项。这些孩子有一个特定的顺序,在它们被排序之前是随机的。

在我的用户界面中,我可以输入子项的引用以获取符合条件的父项。只有具有我输入的特定顺序的父项,例如应返回 wetk4wetk6

return $items->filter(fn ($item) => $item->children->contains('wetk4') && $item->children->contains('wetk6'))

这将正确地为我提供带有子项的项目,但这并没有考虑到项目符合条件的顺序很重要这一事实,因为某些项目将具有相同的子项。

我还没有找到一个优雅的解决方案,试图只使用集合函数

解决方法

我想我会尝试使用宏来扩展 Laravel 集合,您应该在其中实现自定义功能。之后该宏可以用于任何 Laravel 集合

此处有更多详细信息:https://laravel.com/docs/8.x/collections#extending-collections

,

我可能会在此处将宏与其他收集功能结合使用。有一个mysql函数叫FIELD,听起来和这个很像。我们可以编写一个名为 FIELD 的宏。

use Illuminate\Support\Collection;

AppServiceProvider()
{
    public function boot()
    {
        Collection::macro('field',function ($key,array $order) {
            $ordering = collect();

            foreach($order as $searchValue) {
                $ordering = $ordering->concat($this->where($key,$searchValue));
            }

            $ordering = $ordering->concat($this->whereNotIn($key,$order));

            return $ordering;
        });
    }
}

从那里您可以使用此宏来过滤您的结果。

$ordering = ['wetk4','wetk5'];

return $items->filter(function($item) use($ordering){
    return count($item['children']->pluck('ref')->diffAssoc($item['children']->field('ref',$ordering)->pluck('ref'))) == 0;
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。