雄辩地执行子查询?

Posted

技术标签:

【中文标题】雄辩地执行子查询?【英文标题】: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 门面。 ***.com/a/31893645/4293929 请问那里的查询有帮助 在没有看到查询和了解模型的详细信息的情况下,这个问题是无法回答的。但是,有几点可能会有所帮助:1)您可以将查询构建器表达式与 Eloquent 模型一起使用,因此 whereRaw 可能会有所帮助; 2)如果你可以重写你的大查询,让它返回一个主键列表,你可以使用whereIn或循环和find来构建一个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();

【讨论】:

以上是关于雄辩地执行子查询?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL - 有条件地执行子查询

GraphQL - 有条件地执行子查询

雄辩地查询与嵌套 WHERE 的关系

使用临时表的子查询查看 where 子句需要非常长时间

6-SQL子查询

带有子查询的 MySQL UPDATE TABLE 不会先执行子查询