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 的 where
和 orWhere
方法:
<?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】:->whereRaw(name in(\'Albert\', \'Alberto\', \'Ana'\)')
或
->where(name, 'LIKE', 'Albert%')
->orWhere(name, 'LIKE', 'Ana%')
【讨论】:
请用一些解释来扩充您的纯代码答案,以减少 *** 是免费代码编写服务的印象。以上是关于Laravel Eloquent:提取所有以提供的字符串列表开头的条目的主要内容,如果未能解决你的问题,请参考以下文章