【问题标题】:Perform sub query in eloquent?雄辩地执行子查询?
【发布时间】:2015-12-13 02:55:47
【问题描述】:

如何在 eloquent 中执行子查询?

我需要转换:

select * from(//complex sub query) as prds order by date desc

【问题讨论】:

  • 您要转换什么查询?我们不是通灵者。
  • 这是一个海量查询,所以没有发布它。我只需要知道如何使用子查询执行选择。
  • 我认为您不能为此使用 Eloquent,因为 Eloquent 连接到模型,而模型又连接到数据库中的单个表。你最好使用 DB 门面。
  • stackoverflow.com/a/31893645/4293929 请问那里的查询有帮助
  • 在没有看到查询和了解模型的详细信息的情况下,这个问题是无法回答的。但是,有几点可能会有所帮助:1)您可以将查询构建器表达式与 Eloquent 模型一起使用,因此 whereRaw 可能会有所帮助; 2)如果你可以重写你的大查询,让它返回一个主键列表,你可以使用whereIn或循环和find来构建一个Eloquent模型列表。

标签: laravel laravel-5 eloquent


【解决方案1】:

如果没有具体的表、列等来回答这个问题是很棘手的。但总的来说,做这种事情的关键是你可以传递一个函数作为whereIn()whereExists()的第二个参数,并且这将创建一个子查询。例如:

Products::whereExists(function ($query) {
   $query->select(DB::raw(1))->from('orders')
      ->whereRaw('orders.product_id = products.id');
})->get();

或者你可以像这样用 whereIn() 做一些事情:

Products::whereIn('id', function ($query) use ($orderID) {
   $query->select('product_id')->from('orders')
      ->where('orders.id', $orderID);
})->get();

【讨论】:

    【解决方案2】:

    首先创建你需要的子查询

    $subQuery = DB::table("some_table as s")
        ->select('s.name', DB::raw('count(s.id) as s_count'))
        ->join('other_table as o', 's.id', '=', 'o.val')
        ->where('o.values', $someVal)
        ->groupBy('s.name');
    

    比可以创建一般查询

    $rows = DB::table(DB::raw("({$subQuery->toSql()}) as sub"))->mergeBindings($subQuery)
        ->where('sub.name', $val)
        ->orderBy("sub.s_count", 'asc')
        ->get();
    

    如果需要,您也可以获取计数

    $count = DB::table(DB::raw("({$subQuery->toSql()}) as sub"))->mergeBindings($subQuery)
        ->where('sub.name', $val)
        ->count();
    

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2017-11-11
      • 2020-01-14
      • 2018-01-26
      相关资源
      最近更新 更多