开发者社区 问答 正文

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行。

展开
收起
几许相思几点泪 2019-12-29 19:29:28 601 分享 版权
阿里云 AI 助理回答

从你的描述来看,你正在使用 Laravel 的 Eloquent ORM 或 Query Builder 来构建数据库查询。在你的第二个示例中,问题可能出在链式调用的处理上。当你分开写时,确保每个部分都正确地引用了上一步的结果。根据你的需求,正确的做法应该是持续链式调用,即使你需要在其中插入条件语句。这里是一个修正后的示例:

use Illuminate\Http\Request;

// ...

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

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

if ($foo === "foo") {
    $sqls->where('age', '=', 'some_value'); // 确保你的 where 子句是完整的,这里我假设了一个示例值 'some_value'
}

if (!empty($bar)) { // 假设你想基于 $bar 添加另一个条件
    $sqls->where('zip_code', '>', '12345');
}

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

// 然后你可以遍历 $return 来处理结果
$return->each(function($item) {
    // 处理每一项,例如:
    // $return .= $item->name . '<br>';
});

注意点: 1. 在 where 函数中,确保提供了完整的条件表达式(比如 where('column', operator, value))。 2. 你提到的 $sql->each 应该是直接对 $return(即查询结果集合)进行操作,因为 get() 方法会返回一个包含数据库结果的集合对象。 3. 如果你确实需要分阶段构建查询,可以考虑使用闭包或者匿名函数来封装逻辑,但在这个场景下直接链式调用是最简洁且推荐的方式。

希望这能帮助到你!如果有其他关于阿里云产品的问题,也欢迎继续提问。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: