Laravel Eloquent:提取所有以提供的字符串列表开头的条目

Posted

技术标签:

【中文标题】Laravel Eloquent:提取所有以提供的字符串列表开头的条目【英文标题】:Laravel Eloquent: Extract all entries that begin with a list of provided string 【发布时间】:2018-06-02 03:21:36 【问题描述】:

以下请求从用户表中提取 name=Albert 或 name=Alberto 或 name=Ana 的所有条目。

$users = DB::table('users')
    ->whereIn('name', ['Albert', 'Alberto', 'Ana'])
    ->get();

是否有可能调整此请求以提取所有以下名称开头的条目?

【问题讨论】:

检查this是否有帮助 【参考方案1】:

为什么不链接orwhere 子句:

$names = ['Albert', 'Alberto', 'Ana'];

$users = DB::table('users');

foreach ($names as $name) 
    $users->orWhere('name', 'like', $name.'%');


$users = $users->get();

【讨论】:

【参考方案2】:

在基本的where 函数上使用like 运算符:

$users = DB::table('users')
            ->where('name', 'like', 'T%')
            ->get();

Source

编辑: 基于此answer(但已简化),这里有一个简单的闭包可以解决您的问题:

$queryStr = ['Albert', 'Alberto', 'Ana'];
$users = DB::Table('users')            
    ->where(function ($query) use ($queryStr) 
         foreach($queryStr as $q)
            $query->orwhere('name', 'like',  $q . '%');
               
    )->get();

【讨论】:

是的,但在您的示例中,只有一个字符串需要检查。我想用提供的字符串数组提出请求 这是不可能的。同一个字符串应该如何以“Albert”和“Ana”开头?没有字符串匹配。也许你的意思是->orWhere()【参考方案3】:

最简单的方法

最简单的方法是嵌套 QueryBuilder 的 whereorWhere 方法:

<?php

$users = DB::table('users')
            ->where('name', 'like', 'Albert%')
            ->orWhere('name', 'like', 'Alberto%')
            ->orWhere('name', 'like', 'Ana%')
            ->get();    

?>

更普遍适用于大量名称

您可以使用QueryBuilder 的whereRaw 方法,并将其与一些基本的php 和sql 结合使用。这样一来,mysql 注入也被自动阻止了。

<?php

$names = [
    'Abert',
    'Alberto',
    'Ana'
];

$conditions = [];
$sqlnames = [];

// of course you can append the wildcards directly, 
// but this is more general applicable
foreach($names as $name)
    $sqlnames[] = $name . '%';
    $conditions[] = '`name` LIKE ?';



// run the query
$users = DB::table('users')
            ->whereRaw(implode(' OR ', $conditions), $sqlnames)
            ->get();

?>

【讨论】:

就性能而言,最好的方法是什么?使用 whereRaw 还是使用 where 闭包? 一般来说,原始 SQL 总是更快。如果您参考我的示例:如果您对 SQL 查询进行硬编码而不是从 $names 数组中生成它,那么它是最快的。【参考方案4】:

-&gt;whereRaw(name in(\'Albert\', \'Alberto\', \'Ana'\)')

->where(name, 'LIKE', 'Albert%')
->orWhere(name, 'LIKE', 'Ana%')

【讨论】:

请用一些解释来扩充您的纯代码答案,以减少 *** 是免费代码编写服务的印象。

以上是关于Laravel Eloquent:提取所有以提供的字符串列表开头的条目的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent重音角色问题

用 Laravel/Eloquent 为 Yajra DataTables 编写连接查询的慢 MySQL

从Laravel和Eloquent的桌子中选择所有

Laravel (Eloquent) 不更新数据库

Laravel Eloquent 所有与关系

Laravel:Mysql 查询到 Eloquent