【问题标题】:Laravel 5.4 - get entrys where column contains specific stringLaravel 5.4 - 获取列包含特定字符串的条目
【发布时间】:2017-12-07 01:37:45
【问题描述】:

如果我尝试获取名称包含传递字符串的数据库条目,则会收到以下错误。

Invalid argument supplied for foreach()

.

$search = $request['search'];
$key_search = explode(' ', $search);
$usergroups = Usergroups::whereIn('name', 'like', '%' . $search . '%')->paginate(3);

$key_search 看起来像这样:[0 => "Test", 1 => "Unicorn"];

现在我想获取名称列中包含包含传递字符串的数据的每个条目,并使用paginate(); 获取查询结果

我也尝试过类似 foreach 循环的方法,它将条目推送到另一个数组中,但这对我也不起作用,因为条目是对象而不是数组。这就是为什么 array_push 无法处理这个问题。

有人知道我可以做些什么来获得参赛作品吗?

感谢您的帮助,抱歉我的英语不好!


根据答案:

问题是我获得了数据库中的每个条目。起初与搜索键匹配的条目和最后一个条目与搜索键完全不匹配。

示例:

我正在通过“测试”和“独角兽”

我的数据库中有 10 个条目。例如:

  1. 测试 dkkawdmawkdkaw
  2. mdkawdawtestdmwakdaw // 测试
  3. 苹果
  4. 橙子
  5. 任何东西
  6. Unicorn /// Unicorn - U 是大写的
  7. 更多 unicornsdawdawd //独角兽
  8. 披萨
  9. 测试
  10. 我没有创意

所以我只想要:1、2、6、7 和 9。但我将它们全部从高匹配排序到根本不匹配。

【问题讨论】:

    标签: php laravel laravel-5 laravel-pagination


    【解决方案1】:

    whereIn()不能用于like查询。

    $usergroups = Usergroups::query();
    
    foreach($key_search as $search) {
      $usergroups = $usergroups->orWhere('name', 'like', '%' . $search . '%')
    }
    
    $usergroups = $usergroups->paginate(3);
    
    // Results in
    // select * from `usergroups` where `name` like ? or where `name` like ?;
    

    你也可以试试这个。

    $usergroups = Usergroups::where(function ($query) use ($key_search) {
                                foreach($key_search as $search) {
                                  $query->orWhere('name', 'like', '%' . $search . '%');
                                }
                              })->paginate(3);
    
    // Results in
    // select * from `usergroups` where (`name` like ? or `name` like ?;
    

    【讨论】:

    • 谢谢,完美!我尝试过类似的方法,但乳清复杂:D 谢谢!
    • 我已经意识到这段代码可以让我返回每个条目。在 $key_search 是测试和分页作为搜索字符串。现在我在名称列中有 3 个带有 test 的条目,而在 paginate 中有 3 个条目。但我也得到名称不包含字符串的条目。我做错了什么 '%' 。 $搜索。 '%' ?
    • @dwdawdawdaw 您是否在寻找 where() 查询?尝试仅使用where() 而不是orWhere()?另外,您确定要查找 like 查询吗?或者您需要完全匹配?
    • 请看我的问题。我已经更新它以更好地解释我的问题
    • Like 查询适用于 upperlower 两者。同样要分页,您需要先执行take(5),然后将此集合传递到LengthAwarePaginator - 阅读this
    【解决方案2】:

    你不能像这样使用whereIn()。请改用多个orWhere(),例如:

    $searchArray = explode(' ', $request->search);
    $userGroups = Usergroups::query();
    foreach ($searchArray as $searchValue) {
        $userGroups = $userGroups->orWhere('name', 'like', '%'.$searchValue.'%');
    }
    $userGroups = $userGroups->paginate(3);
    

    【讨论】:

    • 谢谢!你和 prateekkathals 的答案是一样的,我已经为你的答案投票了 :) 非常感谢!
    • 我还向 prateekkathal 写了这条评论:我意识到这段代码可以让我返回每个条目。在 $key_search 是测试和分页作为搜索字符串。现在我在名称列中有 3 个带有 test 的条目,而在 paginate 中有 3 个条目。但我也得到名称不包含字符串的条目。我做错了什么 '%' 。 $搜索。 '%' ?
    猜你喜欢
    • 2017-08-02
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 2021-12-31
    • 2022-01-12
    • 2021-03-21
    相关资源
    最近更新 更多