Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?

Posted

技术标签:

【中文标题】Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?【英文标题】:Laravel Query Builder use parent query in subquery of `whereIn` statement? 【发布时间】:2021-08-19 22:24:20 【问题描述】:

Laravel 8.x

我正在尝试做类似here 中提到的事情

(从上面的链接复制的代码-对评论的微小更改)

$total = OrderTotals::whereIn('order_id', function($q) use($query) 
   // here would like to use the query of the parent instead of an empty fresh query
)->sum('value);

我想在调用->whereIn 时在子查询中使用上一个查询,这可能吗?我该怎么做?

闭包中的$query 变量是空的,并产生一个select *,没有任何来自或哪里。这是有道理的,因为可以希望子查询是新鲜的。但是如果我想使用现有的查询呢?

我使用this google 搜索以及许多其他方法来查找类似问题。 *** 上的结果似乎没有使用现有查询,它们都添加了新的froms 和wheres(参见here 和this highly rated question)。

【问题讨论】:

据我了解,您需要 OrderTotals,他们的 order_id 在 [...] 中,如果满足某些条件,您希望获得它们的总数。 我想要他们的 order_id 在子查询中的位置,而不是数组。如果我执行 whereIn 并传递一个闭包,那么这就是一个子查询。问题是我希望子查询成为父查询,但 whereIn 并不能让您处理父查询,而只能处理新查询。 我觉得我的回答可以帮到你,看第二部分 【参考方案1】:

看看这样的事情是否有帮助

Model::where(function($query)

    $query->whereIn('order_id', [1,2,3]);

    //OR

    $query->or_where('order_id', function()
         // do something
    );

)->where('other condition')->sum('value');

这也可能有效:

OrderTotals::addSelect(['order_id' => Order::select('id')
    ->whereColumn('active', 0)
    ->orderByDesc('completed_at')
])->sum();

【讨论】:

以上是关于Laravel Query Builder 在“whereIn”语句的子查询中使用父查询?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:在“query-builder”或“eloquent”中更改原始查询

在 laravel 5.3 中调用未定义的方法 Illuminate\Database\Query\Builder::attach()

Laravel 查询错误 - 调用未定义的方法 Illuminate\Database\Query\Builder::query()

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder

laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()

Laravel Query:为 Query Builder 实现 Eloquent Scope