@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 проблему не решить, поскольку сбивается пагинация.
  • Вопрос задан
  • 140 просмотров
Решения вопроса 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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы