Передача логики / выражения в контроллер внутри вложенного цикла for - PullRequest
0 голосов
/ 19 апреля 2020

У меня есть работающий / работающий код, и я изо всех сил пытаюсь его оптимизировать.

Код ниже:

@foreach($semesters as $semester)
    @foreach($student->subjects->where('semester_id', $semester->id) as $subject)
       {{ $subject->name }}
       //some code here
    @endforeach
@endforeach

Итак, я хочу Передайте это выражение $student->subjects->where('semester_id', $semester->id в контроллер, однако запрос зависит от 'semester' l oop. Как вы оптимизируете или реорганизуете код?

Примечание. Мне нужно получить модель субъекта у студента , поскольку они связаны с опорным центром, и мне нужны эти отношения для этого случая.

Заранее спасибо.


Редактировать

Красноречивые связи:

Тема:

public function teacher()
{
    return $this->belongsTo(Teacher::class);
}

public function semester()
{
    return $this->belongsTo(Semester::class);
}

public function students()
{
    return $this->belongsToMany(Student::class)
        ->withPivot('accepted')
        ->withTimestamps();
}

Модель студента:

public function subjects()
{
    return $this->belongsToMany(Subject::class)
        ->wherePivot('accepted', '=',1)
        ->withPivot('accepted')
        ->withTimestamps();
}

Модель семестра:

public function subjects()
{
    return $this->hasMany(Subject::class);
}

Модель учителя:

public function subjects()
{
    return $this->hasMany(Subject::class);
}

Контроллер

public function index(Student $student)) {
     $student->subjects->load('teacher');
     $semesters = Semester::whereIn('id', $student->subjects->pluck('semester_id'))->get();
     return view(....);
}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Вы измените свой контроллер как

$student->subjects->load('teacher');
$semesters = Semester::whereIn('semeters.id', $student->subjects->pluck('semester_id'))
->join('subjects', 'semesters.subject_id', 'subjects.id')
->whereIn('subjects.id', $student->pluck('subject_id'))
->select('semesters.id as id', 'subjects.name as subject_name', ....) //what every values you want
->get();
return view(....);

и измените свой клинок как

@foreach ($semesters as $semester)
      {{ $semester->id }}
      {{ $semester->subject_name }}
        //Your code
@endforeach

Это решит вашу проблему.

0 голосов
/ 19 апреля 2020

Вы можете сделать что-то подобное в вашем контроллере

use App\Semester;
use App\Student;
use Illuminate\Contracts\View\Factory as ViewManager;

public function yourMethod(ViewManager $viewManager)
{
    $semesters = Semester::all();
    $student = App\Student::with(['subjects' => function ($query) use ($semesters) {
        $query->whereIn('semester_id', $semesters->pluck('id'));
    }])->firstOrFail();

    return $viewManager->make('yourView', compact('semesters', 'student'));
}
@foreach ($semesters as $semester)
    @foreach ($semester->subjects as $subject)
        {{ $subject->name }}
        //Your code
    @endforeach
@endforeach
...