@zytia

Как удалить объект с помощью условия из получаемых данных с запроса с пагинацией?

Задача: необходимо получить объект студентов, с условиями 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 проблему не решить, поскольку сбивается пагинация.
  • Вопрос задан
  • 143 просмотра
Решения вопроса 2
pLavrenov
@pLavrenov
Разработка сайтов
Надо использовать whereHas который будет добавлять условие group.id == 2, тогда будут получаться только студенты имеющие отношения группы с нужными условиями.
Ответ написан
Комментировать
@zytia Автор вопроса
$students = Student::with(["user.passport", "group.speciality"]);
        
if(\request("group_id")){ // если есть id группы
     $students = $students->whereHas("group", function ($query) { $query->where("id", \request("group_id")); });
}
        
if(\request("speciality_id")){  // если есть id специальности
     $students = $students->whereHas("group.speciality", function ($query) { $query->where("id", \request("speciality_id")); });
}
        
$students = $students->paginate(\request("page_size") ? : 10)->toArray();

return response()->json($students);
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vitaly_74
@vitaly_74
я думаю что with это тот же left join который при отсутствии связи возвращает null, попробуйте вместо left Join, вставить right join с теми же условиями
либо добавить условие where
WHERE
group.id IS NOT NULL and speciality.id IS NOT NULL
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы