以下请求从users表中提取所有条目,其中name = Albert或name = Alberto或name = Ana。
$users = DB::table('users')
->whereIn('name', ['Albert', 'Alberto', 'Ana'])
->get();
是否有可能调整此请求以提取以下列名称开头的所有条目?
在基本的where
函数上使用like运算符:
$users = DB::table('users')
->where('name', 'like', 'T%')
->get();
编辑:基于这个answer(但简化),这是一个简单的闭包,解决了你的问题:
$queryStr = ['Albert', 'Alberto', 'Ana'];
$users = DB::Table('users')
->where(function ($query) use ($queryStr) {
foreach($queryStr as $q){
$query->orwhere('name', 'like', $q . '%');
}
})->get();
为什么不链接orwhere
条款:
$names = ['Albert', 'Alberto', 'Ana'];
$users = DB::table('users');
foreach ($names as $name) {
$users->orWhere('name', 'like', $name.'%');
}
$users = $users->get();
->whereRaw(name in(\'Albert\', \'Alberto\', \'Ana'\)')
要么
->where(name, 'LIKE', 'Albert%')
->orWhere(name, 'LIKE', 'Ana%')
最简单的方法是嵌套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();
?>