再次回到另一个问题,我希望有人可能有一个想法,关于我正在处理的应用程序。
在这个教育评估应用程序中,我有一个与能力(类似于博客帖子类别)的一对多关系的评估,以及一个与Context(类似于博客标记)的多到多关系。
我正在尝试创建一个报表视图,该视图将允许我为每个能力和上下文组合显示一张卡片,然后计算所有存在该能力和上下文组合的评估(请考虑这一点,即计算每个类别和标签组合中的博客文章数量,即使该数字为0)。
到目前为止,我能够生成一份报告,其中列出了每个能力和上下文组合的卡片,但我不知道如何将这些信息传递给控制器,以便在查询中使用,从而找到相关的评估。
这里是我的报告视图
<x-app-layout title="{{ config('app.name', 'Laravel') }}">
<div class="container grid px-6 mx-auto">
<h2 class="my-6 text-2xl font-semibold text-gray-700 dark:text-gray-200">
{{ __('Reports') }}
</h2>
<div class="grid gap-6 mb-8 md:grid-cols-2 xl:grid-cols-4">
@foreach ($competencies as $competency) <br>
@foreach ($contexts as $context)
<div class="flex items-center p-4 bg-white rounded-lg shadow-xs dark:bg-gray-800">
<div>
<p class="text-lg font-semibold text-gray-700 dark:text-gray-200">
{{ $competency->name}}
</p>
<p class="mb-2 text-sm font-medium text-gray-600 dark:text-gray-400">
{{ $context->name }}
</p>
{{ $assessments }}
</div>
</div>
@endforeach
@endforeach
</div>
</x-app-layout>这里是我的报告控制器
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Assessment;
use App\Models\Competency;
use App\Models\Context;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
class ReportController extends Controller
{
public function index(Competency $competency, Context $context)
{
return view('dashboard.reports.index', [
'competencies' => Competency::where('team_id', Auth::user()->currentTeam->id)->get(),
'contexts' => Context::where('team_id', Auth::user()->currentTeam->id)->get(),
'assessments' => Assessment::where('competency_id', $competency->id)->whereRelation('contexts', 'context_id', $context->id)->count(),
]);
}
}下面是报表视图中当前生成的图像:https://imgur.com/a/SQSf7UM
如果有更多的细节,请告诉我。
发布于 2022-03-06 02:06:09
最好在模型中声明这个关系,让我们假设:
您可以使用它的模型创建一个额外的表来存储评估上下文(因为它可以有许多上下文),假设表名是assessment_contexts,模型名是AssesmentContext。或者您可以运行php artisan make:model AssessmentContext -m。至少它有2列,assessment_id和context_id,
然后在AssessmentContext内部,添加这个函数来创建一个简单的关系,
public function assessment() {
return $this->hasOne(Assessment::class);
}
public function context() {
return $this->hasOne(Context::class);
}在评估模型中声明此功能,
public function competency() {
return $this->hasOne(Competency::class);
}
public function contexts() {
return $this->hasMany(AssesmentContext::class);
}把这个添加到能力模型中,
public function assessments() {
return $this->hasMany(Assessment::class);
}对于上下文模型来说,
public function assessments() {
return $this->hasMany(AssessmentContext::class);
}您必须在评估表中添加外键,该表引用类别主键id (我建议您的列名为category_id)。
最后,在控制器中,您可以声明能力列表,在视图中,您可以访问所有相关数据。即:
return view('dashboard.reports.index', [
'competencies' => Competency::where('team_id', Auth::user()->currentTeam->id)->get()
]);内景,
@foreach ($competencies as $competency) <br>
@foreach ($competency->assessments as $assessment)
<div class="flex items-center p-4 bg-white rounded-lg shadow-xs dark:bg-gray-800">
<div>
<p class="text-lg font-semibold text-gray-700 dark:text-gray-200">
{{ $competency->name}}
</p>
@foreach ($assessment->contexts as $context)
<p class="mb-2 text-sm font-medium text-gray-600 dark:text-gray-400">
{{ $context->name }}
</p>
@endforeach
</div>
</div>
@endforeach
@endforeach这只是一个简单的关系方案,还有其他更好、更优的方法。
https://stackoverflow.com/questions/71367076
复制相似问题