красноречивое отношение и отклонение многомерной коллекции - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть школьная база данных, в которой есть Множество учителей, и в которой есть Множество учеников, например:

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;
    });
});

Но результат совпадает с полным запросом.


Я не знаю, какой путь лучше, красноречивее или коллекционнее, но они не сработают

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Вы также должны выбрать столбцы id и school_id, необходимые для активной загрузки:

School::with(['teachers' => function ($teacher) {
    $teacher->with(['students' => function ($student) {
        $student->where('drop', '!=', 0)
    }])->select('id', 'school_id', 'teacher_name');
}])->get();

Затем удалите их или используйте $ hidden :

$full->map(function ($teacher) {
    unset($teacher->id, $teacher->school_id);
});
0 голосов
/ 07 ноября 2018

Пример из оригинальной документации.

Nested Eager Загрузка Чтобы загружать вложенные отношения, вы можете использовать синтаксис «точка». Например, давайте с нетерпением загрузим всех авторов книги и все личные контакты автора в одно высказывание Eloquent:

$ books = App \ Book :: with ('author.contacts') -> get ();

также вы можете использовать метод load ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...