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

对于我的数据库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 行。


收到一只叮咚
浏览 177回答 2
2回答

手掌心

目前,您调用each的是查询构建器实例,而不是查询的结果(这将是一个集合)。each()在查询生成器上用于分块结果,这将忽略您之前设置的任何限制。首先,要获取您正在工作的代码,您可以将结果分配给一个变量,然后调用each()它。$results = $sqls->orderBy('age', 'asc')->limit(50)->get();$results->each(...);&nbsp;但是,我实际上建议您使用map()和join()而不是each():$results = $sqls->orderBy('id', 'asc')->limit(10)->get();$return = $results->map(function ($item) {&nbsp; &nbsp; return&nbsp; "<td> {$item->id} </td>";})->join('');仅供参考,Laravel 也有一个when()方法来省去你编写多个 if 语句的麻烦,所以你的整个查询看起来像:$results = DB::table('foobar')&nbsp; &nbsp; ->select('id', 'name', 'age', 'zip_code')&nbsp; &nbsp; ->when($request->input('foo') === 'foo', function ($query) {&nbsp; &nbsp; &nbsp; &nbsp; $query->where('age', '<', 31);&nbsp; &nbsp; })&nbsp; &nbsp; ->when($request->input('bar') === 'bar', function ($query) {&nbsp; &nbsp; &nbsp; &nbsp; $query->where('zip_code', '>', '12345');&nbsp; &nbsp; })&nbsp; &nbsp; ->orderBy('age', 'asc')&nbsp; &nbsp; ->limit(50)&nbsp; &nbsp; ->get();$return = $results->map(function ($item) {&nbsp; &nbsp; return&nbsp; "<td> {$item->id} </td>";})->join('');

鸿蒙传说

我想这会对你有所帮助if($request->input('var')) {&nbsp; &nbsp;$var = $request->var;&nbsp; &nbsp;$cond1 = DB::table('table')->select('...')->where('foo','>',$var)-&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;>orderBy()->limit()->get();&nbsp;// more if&nbsp;}
打开App,查看更多内容
随时随地看视频慕课网APP