laravel - Eloquent 中的嵌套选择
问题描述
我想在 Eloquent (Laravel 6 LTS) 中重新创建下面的 SQL
我想避免 DB::raw 因为我在 PartnerPrice::class (model) 后面有逻辑
SELECT *
FROM (SELECT *,
ROW_NUMBER ()
OVER (PARTITION BY group, TYPE
ORDER BY effective_at DESC, created_at DESC)
r
FROM partner_prices
WHERE group = 'premier'
and partner_id = 8
AND TYPE = 'premium'
AND effective_at <= '2020-10-31') a
WHERE r = 1
ORDER BY group;
这是我的工作内部查询。我只需要帮助用另一个选择包装它并添加 where('r', 1)
$sub = PartnerPrice::select('*')
->selectRaw('ROW_NUMBER () OVER (PARTITION BY mccmnc, TYPE ORDER BY effective_at DESC, created_at DESC) r')
->where('type', $type)
->where('partner_id', $partnerId)
->where('group', $group)
->where('effective_at', '<=', now()->subMonth()->lastOfMonth())
->get();
解决方案
您可以像这样使用该toSql
方法mergeBindings
$queryBuilder = PartnerPrice::select('*')
->selectRaw('ROW_NUMBER () OVER (PARTITION BY mccmnc, TYPE ORDER BY effective_at DESC, created_at DESC) r')
->where('type', $type)
->where('partner_id', $partnerId)
->where('group', $group)
->where('effective_at', '<=', now()->subMonth()->lastOfMonth());
$result = DB::table(DB::raw('(' . $queryBuilder->toSql() . ') as a'))
->mergeBindings($queryBuilder->getQuery())
->where('a.r', 1)
->get();
请注意,我省略了get()
第一个构建器
我也认为你可以使用
DB::select('*')
->fromSub($queryBuilder, 'a')
->where('a.r', 1)
->get();
但从来没有用过。也试试这个。
推荐阅读
- javascript - Cal热图显示nan值其他颜色
- javascript - 收到来自 Lambda 的无效响应:无法识别的字段
- javascript - 从根组件反应本机访问功能
- java - 显示到列表视图上的图像视图单击
- python - 如何使用模型对象作为 django-filter MultipleChoiceFilter 的选择
- javascript - 将复制到剪贴板的 jQuery 代码转换为纯 JavaScript
- ssl - 浏览器在 TLS/HTTPS 中发送多少数据包?
- java - 为什么我得到一个空指针访问?
- datatables - DataTables:无法读取未定义的属性“长度”,但 JSON 有效
- python - 需要帮助用美丽的汤和蟒蛇检索第一次出现的东西