【问题标题】:Laravel search for specific contain word on 2 columnsLaravel 在 2 列上搜索特定的包含单词
【发布时间】: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}]

预期结果为空。

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

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

【问题讨论】:

    标签: php laravel


    【解决方案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 找到了解决方案
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多