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

问题描述 投票:1回答:4

以下请求从users表中提取所有条目,其中name = Albert或name = Alberto或name = Ana。

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

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

laravel laravel-5 eloquent
4个回答
1
投票

在基本的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();

1
投票

为什么不链接orwhere条款:

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

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

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

$users = $users->get();

0
投票

->whereRaw(name in(\'Albert\', \'Alberto\', \'Ana'\)')

要么

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

0
投票

Simplest method

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

<?php

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

?>

More general applicable for large array of names

您可以使用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();

?>
© www.soinside.com 2019 - 2024. All rights reserved.