collection 实例(非 ORM 实例)可不可以用 where 方法利用 ‘like’ 模糊查询

事情是这样的,现在我将一个数组转成Collection实例(Illuminate\Support\Collection

$newData = collect($data); //数组变成集合

like查询的两种方式:

$newData = $newData->where('name','like',$dutyName); //全名查询
$newData = $newData->where('name','like','%' . $dutyName . '%'); //模糊查询

结果:

模糊查询返回的数据为空
全名查询可以正常查询出数据

纠结了好长时间,最后得出结论:模糊查询的‘%’可能有问题

//$dutyName是全名的情况下运行下面两行代码:
$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
$newData = $newData->where('name','like','%' . '$dutyName');  //输出数据为空

很奇怪哎....想问一下如何解决这个问题?

补充:
文档中写到:默认情况下, Eloquent查询的结果返回的内容都是 Collection 实例。

集合实例:Illuminate\Support\Collection
Eloquent实例:Illuminate\Database\Eloquent\Collection

难道只能通过Eloquent实例来模糊查询吗?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
LDL1023
最佳答案

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

6年前 评论
讨论数量: 4
LDL1023

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

6年前 评论

QueryBuilder的where like是使用数据库查询,至于集合,你先要确定有like这个operator

        switch ($operator) {
            default:
            case '=':
            case '==':  return $retrieved == $value;
            case '!=':
            case '<>':  return $retrieved != $value;
            case '<':   return $retrieved < $value;
            case '>':   return $retrieved > $value;
            case '<=':  return $retrieved <= $value;
            case '>=':  return $retrieved >= $value;
            case '===': return $retrieved === $value;
            case '!==': return $retrieved !== $value;
        }
6年前 评论
LDL1023

collection 是不支持 like 查询的

collection where 的源码

public function where($key, $operator, $value = null)
{
    return $this->filter($this->operatorForWhere(...func_get_args()));
}

protected function operatorForWhere($key, $operator, $value = null)
{
       ...

            switch ($operator) {
                default:
                case '=':
                case '==':  return $retrieved == $value;
                case '!=':
                case '<>':  return $retrieved != $value;
                case '<':   return $retrieved < $value;
                case '>':   return $retrieved > $value;
                case '<=':  return $retrieved <= $value;
                case '>=':  return $retrieved >= $value;
                case '===': return $retrieved === $value;
                case '!==': return $retrieved !== $value;
            }
    ...
}

当 operator 不支持时,默认为 "=",

$newData = $newData->where('name','like',$dutyName);   //可以正常输出数据
// 这句代码实际是 $newData->where('name','=',$dutyName); 

Eloquent 实例来模糊查询实际上是数据库的 LIKE 查询

6年前 评论
ALMAS

这头像是不是跟站长头像重了😂😂😂

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!