Задача: необходимо получить объект студентов, с условиями id группы и id специальности, где все эти 3 таблицы связаны. Также необходимо сделать пагинацию только тех объектов студентов, у которых была найдена группа и специальность.
Код:
$students = Student::with([
"group" =>
function($query) {
$query->where("id", \request("group_id"));
},
"group.speciality" =>
function($query) {
$query->where("id", \request("speciality_id"));
},
])->paginate(\request("page_size") ? : 10)->toArray();
return response()->json($students);
Проблема: если данные группы или специальности не находятся, то объект всё-равно добавляется с атрибутом group: null в пагинацию, тем самым не удается отобразить запрашиваемое кол-во элементов на странице. Как можно решить эту проблему?
При запросе
group_id = 2
speciality_id = 2
page_size = 2
Возвращается такой объект:
{
"current_page": 1,
"data": [
{
"id": 1,
"receipt_date": "2010-11-02",
"user": {
"id": 1,
"login": "ykirillova@gmail.com",
"phone": "+7 (922) 472-9240",
"role": "user",
"passport": {
"series": 1762,
"number": 384282,
"date_of_issue": "1991-11-27",
"issued": "magni",
"division_code": 3,
"scan": "*photo link*",
"secondname": "Куликова",
"firstname": "Ольга",
"thirdname": "Анисимова",
"birthday": "1973-05-13",
"sex": "W"
}
},
"group": {
"id": 2,
"group_code": "4433",
"speciality": {
"id": 2,
"specialty_title": "Программирование в компьютерных системах",
"faculty": "СПО ИКТЗИ"
}
}
},
{
"id": 2,
"receipt_date": "1973-11-07",
"user": {
"id": 2,
"login": "marta.fedorov@dackov.net",
"phone": "+7 (922) 903-0339",
"role": "user",
"passport": {
"series": 8241,
"number": 419233,
"date_of_issue": "1980-06-05",
"issued": "quos",
"division_code": 33,
"scan": "*photo link*",
"secondname": "Ефремов",
"firstname": "Болеслав",
"thirdname": "Костин",
"birthday": "2009-04-03",
"sex": "W"
}
},
"group": null
}
],
"per_page": "2",
"total": 75
}
Тогда как при group == null должен вернуться только 2 объекта с группами
{
"current_page": 1,
"data": [
{
"id": 1,
"receipt_date": "2010-11-02",
"user": {
"id": 1,
"login": "ykirillova@gmail.com",
"phone": "+7 (922) 472-9240",
"role": "user",
"passport": {
"series": 1762,
"number": 384282,
"date_of_issue": "1991-11-27",
"issued": "magni",
"division_code": 3,
"scan": "*photo link*",
"secondname": "Куликова",
"firstname": "Ольга",
"thirdname": "Анисимова",
"birthday": "1973-05-13",
"sex": "W"
}
},
"group": {
"id": 2,
"group_code": "4433",
"speciality": {
"id": 2,
"specialty_title": "Программирование в компьютерных системах",
"faculty": "СПО ИКТЗИ"
}
}
},
{
"id": 5,
"receipt_date": "2002-07-05",
"user": {
"id": 5,
"login": "tester@mail.ru",
"phone": "+7 (800) 555-3535",
"role": "user",
"passport": {
"series": 5521,
"number": 866521,
"date_of_issue": "1980-06-05",
"issued": "quos",
"division_code": 33,
"scan": "*photo link*",
"secondname": "Павлов",
"firstname": "Денис",
"thirdname": "Артемьев",
"birthday": "2009-04-03",
"sex": "W"
}
},
"group": {
"id": 2,
"group_code": "4433",
"speciality": {
"id": 2,
"specialty_title": "Программирование в компьютерных системах",
"faculty": "СПО ИКТЗИ"
}
}
}
],
"per_page": "2",
"total": 75
}
Представленные данные не имеют значение, поскольку они являются случайно сгенерированными.
Удаление элементов data циклом с group равной null проблему не решить, поскольку сбивается пагинация.