Laravel查询生成器中的条件WHERE语句不适用于LIMIT

时间:2019-12-29 08:14:25

标签: php mysql laravel

对于我的数据库table,以下代码可以正常运行:

$sql = DB::table('table')->select('id')->orderBy('id', 'asc')->limit(50)->get();

有50行,但不是:

$sql = DB::table('table')->select('id');
$sql->orderBy('id', 'asc')->limit('50')->get();

确实会返回正确的行,但是会返回数据库本身中的所有行。我需要能够将其分开,因为我打算在if语句之间添加WHERE子句,具体取决于用户输入(编辑:添加的代码与实际代码类似):

$foo = $request->input('foo');
$bar = $request->input('bar');

$sqls = DB::table('foobar')->select('id', 'name', 'age', 'zip_code');

if($foo === "foo") $sqls->where('age', '<', 31);
if($bar === "bor") $sqls->where('zip_code', '>', '12345');

$sqls->orderBy('age', 'asc')->limit(50)->get();

$return = '';

$sqls->each(function($sql) use (&$return){
     $return .= "<td> {$sql->id} </td>"
}

返回所有行,而不是限制为50行。

2 个答案:

答案 0 :(得分:1)

当前,您正在查询构建器实例上调用 df = df[df['customer_id'].isin(df22['customer_id'])] 而不是查询结果(这将是一个集合)。查询构建器上的each用于对结果进行分块,这将忽略您之前可能设置的任何限制。

首先,要获取可以使用的代码,可以将结果分配给变量,然后在该变量上调用each()

each()

但是,我实际上建议您使用map()join()而不是each()

$results = $sqls->orderBy('age', 'asc')->limit(50)->get();

$results->each(...); 

仅供参考,Laravel还具有when()方法,可以节省编写多个if语句的麻烦,从而使整个查询看起来像这样:

$results = $sqls->orderBy('id', 'asc')->limit(10)->get();

$return = $results->map(function ($item) {
    return  "<td> {$item->id} </td>";
})->join('');

答案 1 :(得分:-1)

我认为这对您有帮助

if($request->input('var')) {
   $var = $request->var;
   $cond1 = DB::table('table')->select('...')->where('foo','>',$var)- 
             >orderBy()->limit()->get();
 // more if 
}