У меня есть школьная база данных, в которой есть Множество учителей, и в которой есть Множество учеников, например:
class School extends Model
{
public function teachers()
{
return $this->hasMany(Teacher::class,'school_id');
}
}
class Teacher extends Model
{
public function students()
{
return $this->hasMany(Student::class,'teacher_id');
}
}
class Student extends Model
{
}
Полный запрос
$full = School::with(['teachers' => function ($query) {
$query->with('students');
}])->get();
И результат такой:
[
{
"id": 1,
"school_name": "First Park",
"teachers": [
{
"id": 1,
"teacher_name": "Mr.Aha",
"students": [
{
"id": 1,
"student_name": "Jane",
"drop": 1
},
{
"id": 2,
"student_name": "Jon",
"drop": 0
}
]
}
]
}
]
Теперь я хочу удалить ученика, бросившего школу, и выбрать имя учителя, поэтому я пытаюсь сделать это с помощью eloquent и collection, но все они терпят неудачу.
Красноречивый путь:
School::with(['teachers' => function ($teacher) {
$teacher->with(['students' => function ($student) {
$student->where('drop', '!=', 0)
}])->select('teacher_name');
}])->get();
Но результат вывода учителя - пустой объект.
Способ сбора основан на полном запросе
$full->map(function ($teacher) {
unset($teacher->id);//there are more column to unset in real life
$teacher->reject(function ($student) {
return $student->drop == 0;
});
});
Но результат совпадает с полным запросом.
Я не знаю, какой путь лучше, красноречивее или коллекционнее, но они не сработают