laravel - 如何在结果需要另一个查询()的情况下进行查询()?
问题描述
我目前正在使用 Laravel Excel 构建工作表。该工作表需要一个返回集合的查询,我需要该集合的结果来查询 whereBetween() 以获取 map() 的集合。
我确实有能力收集所有提交,但我需要从用户的模型中严格指定,以便关系正常工作并且仅限于分配给该用户的内容。
我在另一个代码区域中使用的当前方法使用以下方法:
$user_contracts = \Auth::user()->contracts()->get();
$submission_id = array();
foreach ($user_contracts as $contract) {
$submissions = $contract->submissions()->get();
foreach ($submissions as $submission) {
$submission_id[] = $submission->id;
}
}
$user_submissions = FormSubmission::whereIn('id', $submission_id)->get();
这将返回正确的结果。
我相信我需要使用这个 query() 函数来生成 Laravel Excel 生成工作表所需的 map() 函数。
public function query()
{
$time_start = Carbon::now()->setTime(0, 0, 0);
$time_end = Carbon::now()->setTime(24, 0, 0);
return User::query()->find($this->user->id)->contracts()->submissions()->whereBetween('created_at', [$time_start, $time_end]);
}
错误结果:Property [submissions] does not exist on this collection instance.
解决方案
感谢Laravel Eloquent 嵌套查询 ,我能够回答我自己的问题。
这是我最终得到的最终代码。
public function query()
{
$time_start = Carbon::now()->setTime(0, 0, 0);
$time_end = Carbon::now()->setTime(24, 0, 0);
$contracts = $this->user->contracts()->get()->pluck('id')->toArray();
return FormSubmission::query()->whereHas('contracts', function($q) use ($contracts) {
$q->whereIn('contract_id', $contracts);
})->whereBetween('created_at', [$time_start, $time_end]);
}
我仍然愿意接受更优雅的答案。
推荐阅读
- python - Django 过滤不适用于复选框
- python - Firestore 集合快照退出且不再开始 - `Thread-ConsumeBidirectionalStream exiting`
- python - ABCMeta.register 的使用
- c# - 使用 OAuth 验证 API 请求?
- excel - 使用“公式”库重新计算 Excel 电子表格
- ios - 将 sepiaTone 应用于 swiftui 中的照片到滚动视图对象中
- ssl - 为 MarkLogic 集群使用 SSL 主机名
- ios - 弹出到根视图控制器时导航栏消失
- automation - 如何通过附属网络自动化工作流程?
- google-sheets - 在 Google 表格中的特定符号之前提取一些字符