Laravel雄辩的子查询

时间:2020-10-28 21:53:00

标签: php mysql laravel eloquent subquery

我已经找到了一些类似的主题,所以很抱歉,如果这是一种转发,但是我试图使用Laravel在Eloquent中编写此查询,以便我可以分页,但坦率地说,它使我感到困惑。 有人可以帮忙吗?

以下是查询:

$results = DB::select(
    'SELECT * FROM tickets WHERE id IN '.
    '(SELECT ticket_id FROM working_on WHERE user_id ='.Auth::user()->id.
    ' AND NOT state=0 AND NOT state=2)'
) -> orderBy("id", "desc") -> paginate(3);

哪个返回错误:“在数组上调用成员函数orderBy()”,因为它不是以雄辩的风格编写的。

谢谢

2 个答案:

答案 0 :(得分:0)

尝试

$results = Ticket::where('user_id', Auth::user()->id)->where('state','!=',0)->where('state','!=',2)->orderBy("id", "desc")->paginate(3);

答案 1 :(得分:0)

您使用的select错误。 select方法接受列名作为参数。如果您不使用原始表达式,那也将是最好的,因为这样做会丢失Laravel的转义。相反,您应该利用Laravel的查询生成器。

它看起来应该像这样:

DB::table('tickets')
  ->select('*')
  ->whereIn('id', function($query) {
    $query->select('ticket_id')
      ->from('working_on')
      ->where('user_id', Auth::user()->id)
      ->whereNotIn('state', [0, 2]);
  })->orderByDesc('id')
  ->paginate(3);

顺便说一句,第一个select是多余的,因为*是默认值。

另外,考虑直接查询Ticket模型而不是查询数据库表或创建WorkingOn模型并使用它。