雄辩地执行子查询?
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();
【讨论】:
以上是关于雄辩地执行子查询?的主要内容,如果未能解决你的问题,请参考以下文章