Сортировка отношения ownToMany по массиву идентификаторов - PullRequest
1 голос
/ 10 февраля 2020

У меня есть модель Classroom с отношением belongsToMany. Я хочу, чтобы порядок его дочерних элементов охотно определялся с помощью массива идентификаторов, уже имеющихся в модели, например, student_ids имеет [5,1,7,9,2].

Другими словами, всякий раз, когда я получаю Classroom, он всегда должен выбирать Students в этом порядке.

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

Я пробовал sortBy('student_ids') и orderBy('student_ids'), которые не работают - но мне удалось удалось отсортировать их, используя что-то подобное в моем Classroom контроллере :

public function sortedStudents($ids)
{
    return $this->students()->sortBy(function ($student) use ($ids) {
        return array_search($student->id, $ids);
    });
}

Это работает, но мне нужно передать в ids по факту. Я хотел бы обработать его «по умолчанию» в самих отношениях.

Спасибо. ?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Вы можете использовать метод orderByRaw и FIELD() для заказа по заданной последовательности значений c:

public function students()
{
    return $this->belongsToMany(Student::class)->withTimestamps()->orderByRaw("FIELD(id, 5,1,7,9,2)");
}
1 голос
/ 10 февраля 2020

Вы можете использовать метод withPivot для включения идентификаторов учеников, которые затем позволяют упорядочивать:

public function students()
{
    return $this->belongsToMany(Student::class)->withPivot('student_id')->orderBy('classroom_student.student_id');
}

Я предполагал, что в этом примере ваша сводная таблица называется classroom_student.

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