Laravel 5.4 - 获取列包含特定字符串的条目

Posted

技术标签:

【中文标题】Laravel 5.4 - 获取列包含特定字符串的条目【英文标题】:Laravel 5.4 - get entrys where column contains specific string 【发布时间】: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 个条目。例如:

    测试 dkkawdmawkdkaw mdkawdawtestdmwakdaw // 测试 苹果 橙子 任何东西 Unicorn /// Unicorn - U 是大写的 更多 unicornsdawdawd //独角兽 披萨 测试 我没有创意

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

【问题讨论】:

【参考方案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 个条目。但我也得到名称不包含字符串的条目。我做错了什么 '%' 。 $搜索。 '%' ?

以上是关于Laravel 5.4 - 获取列包含特定字符串的条目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4:直接从数据库中的列中减去数字

在 laravel 5.4 中更新列值

播种时LARAVEL 5.4 SQL“找不到列”

使用迁移 Laravel 5.4 更新列

created_at 列中的时间不正确 - Laravel 5.4

如何在 Laravel 上获取具有自定义列名的特定列