закрытие использования laravel с отношениями - PullRequest
0 голосов
/ 09 ноября 2018

Предположим, у меня есть модель Group и Student, это отношение один-ко-многим;

Group имеет множество Student, каждый Student имеет атрибут id и tuition.

Итак, я хочу получить Группу с номерами студентов и всем обучением.

Вот мой код:

Group::with(['student'=>function($query){
        $query->select(DB::raw('count(`id`) as numbers, sum(tuition) as total')); 
    }])->paginate(10);

Это не работает, я попытался напечатать sql, и sql:

select count(id) as numbers, sum(tuition) as total from `group` where `student`.`group_id` in (`1`, `2`, `4`, `5`, `6`, `7`, `8`, `11`, `12`, `13`, `14`)

Я могу получить результаты при запуске raw sql в mysql, но laravel ничего не возвращает о count или sum.

Ответы [ 3 ]

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

Вы можете использовать withCount() вместо with()

https://laravel.com/docs/5.5/eloquent-relationships#counting-related-models

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

Проверено много;

Когда я использую find, получаю только одну строку.

Group::with(['student'=>function($query){
    $query->select(DB::raw(' group_id ,count(`id`) as number, sum(tuition) as total')); 
}])->find(1);

Это сработало.

Единственное, что мне не хватает, мне нужно выбрать student.group_id, что означает foreign key в hasMany отношениях.

Но когда вы хотите использовать paginate или get метод выборки умножить строки.

Вы получите только общий результат, если ваш первый объект модели с другими значениями равен нулю.

        {
            "id": 1,
            "name":"first",
            "student": [
                {

                    "group_id": 1,
                    "number": 129,
                    "total": "38700.00"
                }
            ]
        },
        {
            "id": 2,
            "name":"second",
            "student": []
        },
        {
            "id": 3,
            "name":"third",
            "student": []
        },

Просто добавьте ->groupBy('group_id) и вы получите то, что хотите

 Group::with(['student'=>function($query){
    $query->select(DB::raw('id, class_id ,count(`id`) as numbers, sum(tuition) as total'))->groupBy('group_id'); 
}])->paginate(10);

Результат:

 {
            "id": 1,
            "name":"first",
            "student": [
                {

                    "group_id": 1,
                    "number": 40,
                    "total": "12000.00"
                }
            ]
        },
        {
            "id": 2,
            "name":"second",
            "student": [
                {

                    "group_id": 2,
                    "number": 43,
                    "total": "12900.00"
                }

                       ]
        },
        {
            "id": 3,
            "name":"third",
            "student": [
               {

                    "group_id": 3,
                    "number": 46,
                    "total": "13800.00"
                }
             ]
        },
0 голосов
/ 09 ноября 2018

Используйте withCount() вместо with():

Group::withCount([
    'student as numbers',
    'student as total' => function($query) {
        $query->select(DB::raw('sum(tuition)'));
    }
])->paginate(10);

Решение для Laravel 5.2:

Group::selectRaw('(select count(*) from students where groups.id = students.group_id) as numbers')
    ->selectRaw('(select sum(tuition) from students where groups.id = students.group_id) as total')
    ->paginate(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...