php Laravel集合搜索不区分大小写

7d7tgy0s  于 2023-03-16  发布在  PHP
关注(0)|答案(4)|浏览(169)

我正在搜索一个集合,我想让这个搜索不区分大小写,或者至少把集合的值改成小写。我该怎么做?

$value = strtolower($value);
$collection = $collection->where($attribute, $value);

$value是小写的,而集合中的内容不是,因此没有匹配项。

vzgqcmou

vzgqcmou1#

您可以改为使用filter()方法和回调函数来完成您想要的任务:

$collection = $collection->filter(function ($item) use ($attribute, $value) {
    return strtolower($item[$attribute]) == strtolower($value);
});
1zmg4dgp

1zmg4dgp2#

可以Map集合并将每个项的属性小写:

$value = strtolower($value);
$collection = $collection
    ->map(function ($item) use ($attribute) {
        $item->{$attribute} = strtolower($item->{$attribute});

        return $item;
    })
    ->where($attribute, $value);
vom3gejh

vom3gejh3#

我创建了一个集合宏,用于执行不区分大小写的搜索。
下面的版本将获取集合中第一个匹配大小写不敏感项的项。
将此添加到您的服务提供商:

Collection::macro('insensitiveFirstWhere', function ($key, $value = null) {
        if (func_num_args() === 1) {
            $value = true;
        }
        else if (is_string($value)) {
            $value = mb_strtolower($value);
        }

        return $this->first(function ($item) use ($key, $value) {
            $itemValue = $item->{$key};
            if (is_string($itemValue)) {
                $itemValue = mb_strtolower($itemValue);
            }
            return $itemValue == $value;
        });
    });

要使用它,只需调用:

$collection = collect(['name' => 'John'], ['name' => 'Bobby']);
// will return John, as 'John' == 'john'
$collection->insensitiveFirstWhere('name', 'john');
vyswwuz2

vyswwuz24#

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    { 
        Collection::macro('locate', function (string $attribute, string $value) {
            return $this->filter(function ($item) use ($attribute, $value) {
                return strtolower($item[$attribute]) == strtolower($value);
            });
        });
    }
}

像这样使用它:

$collect->locate("sku", "KFALTJK2321")->first()

相关问题