Laravel 在 2 列上搜索特定的包含单词

Posted

技术标签:

【中文标题】Laravel 在 2 列上搜索特定的包含单词【英文标题】:Laravel search for specific contain word on 2 columns 【发布时间】:2016-09-01 09:49:21 【问题描述】:

我在使用 Laravel where 和 like 搜索查询时遇到问题。

$words = 'as';

$query = Category::where(function ($query) use ($words) 
                $query->where('name', 'like', $words. '%')
                      ->orWhere('name', 'like', '%'. $words . '%')
                      ->orWhere('location_name', 'like', $words.'%')
                      ->orWhere('location_name', 'like', '%'. $words . '%')
                )->pluck('name', 'location_name');

结果是:

[name: Chocolate Spa, location_name: Throne Glass]

预期结果为空。

我希望它搜索名称和位置名称列以给定单词开头,但不包含该单词。

我怎样才能实现这种搜索方法?

【问题讨论】:

【参考方案1】:

这里是解决方案:

Category::where(function ($q) use ($keywords) 
    $q->where('name', 'like', $keywords . '%')
        ->orWhere('name', 'like', '% ' . $keywords . '%');
);
->orWhere(function ($q) use ($keywords) 
    $q->where('location_name', 'like', $keywords . '%')
        ->orWhere('location_name', 'like', '% ' . $keywords . '%');
);

【讨论】:

您仍然在关键字前包含通配符。在您的第一个示例中,搜索“Spa”(注意空格)将返回您不想要的结果。【参考方案2】:

目前,您在单词前后使用 mysql 通配符 ('%')。这将匹配包含该单词的任何内容。如果你只想让它以单词开头,你只想匹配末尾的通配符而不是开头。

试试这个。

$words = 'as';

$query = Category::where('name', 'like', $words . '%')
                -> orWhere('location_name', 'like', $words .'%')
                -> pluck('name', 'location_name');

【讨论】:

已经为您提供了以不以开头为结尾的方法 - 请尝试更正的答案。 它可以工作,但是如果名称是“焦糖”。它会让我空虚。 我使用来自 laravel 的高级 where 找到了解决方案

以上是关于Laravel 在 2 列上搜索特定的包含单词的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中的网络爬虫

搜索包含列表中的单词并具有特定文件扩展名的文件名

laravel 搜索多个以空格分隔的单词

使用 Vuejs 填充特定输入 - 来自数据库的 Laravel

如何在laravel中使用逗号分隔值的列上使用'where'

laravel 我需要在 unique() 列上使用 index() 吗?