【问题标题】:Starting Query Builder without using a query不使用查询启动查询生成器
【发布时间】:2018-12-26 12:07:02
【问题描述】:

所以,我可以使用User::where('username', '!=', null)->get()

但是,我想使用从第一个条件开始的 if 条件来链接查询,在这种情况下,where('username', '!=', null) 是不必要的。让我举一个伪例子:

我正在运行基于用户的报告,其中有多个字段。我想像这样初始化查询构建器,并使用 if 语句链接查询。

$user = User::class();   // I know I can't use this line, however you'll get the idea.

if (isset($gender)) {
   $user = $user->where('gender', $gender);
}

if (isset($age)) {
   $user = $user->where('age', $age);
}

$users = $user->get()

是开始查询(在第一行)的唯一方法:

$user = User::where('username', '!=', null)

【问题讨论】:

  • 就在今天,我回答了一个问题,该问题的答案完全符合您的问题。欢迎随时check it out
  • 顺便说一句,最好使用$query->whereNotNull('username') 而不是$query->where('username', '!=', null),因为它将利用SQL 连接的本机语法(即,它更易于跨数据库系统移植)。
  • @Namoshek 啊哈!那很有意思! when 是否像isset() 一样工作,如果我的请求中没有$request->dummy 而我在when() 中使用它,比如when($request->dummy..
  • 请看when($value, $callback, $default)here的代码。它基本上只执行if($value),因此在request()->get('field') 上使用它是可以的,但如果您有0 的输入,则可能无法工作。

标签: laravel laravel-5 eloquent laravel-query-builder


【解决方案1】:

你可以像这样实例化你的对象:

$user = (new User);

注意:但是最好使用when() 而不是 if 语句。

$users = User::when($gender, function ($query, $gender) {
    $query->where('gender', $gender);
})
->when($age, function ($query, $age) {
    $query->where('age', $age);
})
->get();

如果变量未初始化,您可以使用isset() 方法,例如:

$users = User::when( isset($gender), function ($query, $gender) {
    $query->where('gender', $gender);
})
->when( isset($age), function ($query, $age) {
    $query->where('age', $age);
})
->get();

【讨论】:

  • when 很新,对吧?你能举个伪例子吗?
  • 您将需要when 中的isset。所以它将是when(isset($gender), ...)
  • 同时更新,谢谢您的干预。
  • 我添加了一个示例@senty
  • 不应该依赖于版本。 when($value, $callback)$value 作为第二个参数传递给 $callback。所以如果你使用isset($something),这只能是truefalsegit blame 说从 5.4 开始就是这样。
【解决方案2】:

你正在寻找

$userQuery = User::query();

然后,添加一些附加条款:

$userQuery->where(...);

然后,提供closure->first()->get() 等)来获取您的用户:

$users = $userQuery->get();

【讨论】:

  • 非常感谢!这是 OP 的答案,但另一个答案也很巧妙
  • 不用担心。 ->when() 方法在这里很有意义;可能必须自己开始使用该方法。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 2017-01-17
  • 2020-02-12
  • 2012-12-07
  • 2020-11-24
  • 1970-01-01
  • 2015-07-10
相关资源
最近更新 更多