Ваш подход совершенно противоположен тому, что рекомендуется. Контроллеры должны обрабатывать взаимодействие между вашим представлением и моделью. Модель должна содержать только детали, относящиеся к модели, такие как отношения, и то же самое относится к представлениям.
Введение в MVC framework: https://www.tutorialspoint.com/mvc_framework/mvc_framework_introduction.htm
Лично У меня было бы 3 контроллера для вопросов, категорий и администраторов, а также для модели, например, так:
Test. php
class Test extends Model
{
protected $fillable = ['name','description','category_id','difficulty','max_time','questions','max_points'];
public function category() // info about chosen tests category
{
return $this->belongsTo(Category::class,'category_id','id');
}
public function users() // pivot table
{
$this->belongsToMany(User::class,'user_test');
}
public function getQuestionsInfo()
{
return $this->hasMany(Question::class)->with(['answersCount']);
}
}
QuestionController . php
use App\Test; // Import Model in Controller
namespace App\Http\Controllers;
class QuestionsController extends Controller
{
public function questions() // questions with answers related to chosen test
{
return $this->hasMany(Question::class)->inRandomOrder();
}
public function getTestData($id) // get questions with answers + category
{
return Test::with(['questions.answers','category'])->where('id',$id)->get();
}
}
КатегорииКонтроллера. php
<?php
namespace App\Http\Controllers;
class CategoriesController extends Controller
{
public function testCategories() // full info about every available category {
return $this->with('category')
->select('category_id',
DB::raw('min(difficulty) as minDifficulty'),
DB::raw('max(difficulty) as maxDifficulty'),
DB::raw('count(id) as total'))
->groupBy('category_id')
->get();
}
public function categoryTests($id,$testName = null) // list of tests in chosen category
{
if(is_null($testName)) {
return $this->with('category')
->where('category_id', $id)
->get();
} else {
return $this->with('category')
->where('name','like','%' . $testName . '%')
->get()
->sortBy('category_id');
}
}
}
Admin Controller
<?php
use App\Test; // Import Model in Controller
namespace App\Http\Controllers;
class AdminController extends Controller
{
public function getAdminTestData($data)
{
return Test::with(['questionsCount','category'])
->where('id',($id ?? '!='),($id ?? 'null'))
->orderBy($data['orderBy'] ?? 'id',$data['param'] ?? 'asc')
->paginate(15);
}
public function questionsCount()
{
return Test::hasMany(Question::class)
->select('id','test_id',DB::raw('count(test_id) as total'))
->groupBy('test_id');
}
public function saveTest($data)
{
return Test::create([
'name' => $data['testName'],
'description' => $data['testDescription'],
'category_id'=> $data['testCategory'],
'difficulty' => $data['testDifficulty'],
'max_time' => $data['maxTime'],
'questions' => $data['questionsCount'],
'max_points' => $data['max_points']
]);
}
public function getTestInfo($id)
{
return Test::with('getQuestionsInfo')->where('id',$id)->first();
}
public function updateTest($id,$data)
{
Test::find($id)->update([
'name' => $data['name'],
'category_id' => $data['category_id'],
'description' => $data['description'],
'max_time' => $data['max_time'],
'difficulty' => $data['difficulty'],
]);
}
}
Код не гарантирован, так как может быть синтаксис или логическая ошибка, но структура - это то, что я пытаюсь донести.