我目前正在使用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.
答案 0 :(得分:0)
感谢Laravel Eloquent nested query 我能够回答自己的问题,
这是我最终得到的最终代码。
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]);
}
我仍然愿意接受更优雅的答案。