Конвертировать необработанный SQL-запрос в Laravel DB Query - PullRequest
0 голосов
/ 29 августа 2018

У меня следующий необработанный запрос SQL:

select a.id user_id, a.email_address, a.name_first, a.name_last, count(b.id) number_of_videos, sum(b.vimeo_duration) total_duration, sum(b.count_watched) total_playbacks
  from users a,
       videos b
 where a.id = b.tutor_id
   and a.email_address in ('candace_rennie@yahoo.com', 'tjm@hiltoncollege.com', 'matthewjameshenshall@gmail.com', 'nkululeko@syafunda.co.za', 'khulile@syafunda.co.za', 'nzakheni@syafunda.co.za')
 group by a.id;

Это правильно получает 6 строк из базы данных. Я пытаюсь преобразовать это в запрос к базе данных Laravel следующим образом:

$totals = DB::table('users')
                    ->select(DB::Raw('users.id as user_id'), 'users.email_address', 'users.name_first', 'users.name_last', DB::Raw('count(videos.id) as number_of_videos'), DB::Raw('sum(videos.vimeo_duration) as total_duration'), DB::Raw('sum(videos.count_watched) as total_playbacks'))
                    ->join('videos', 'users.id', '=', 'videos.tutor_id')
                    ->where('users.id', 'videos.tutor_id')
                    ->whereIn('users.email_address', array('candace_rennie@yahoo.com', 'tjm@hiltoncollege.com', 'matthewjameshenshall@gmail.com', 'nkululeko@syafunda.co.za', 'khulile@syafunda.co.za', 'nzakheni@syafunda.co.za'))
                    ->groupBy('users.id')
                    ->get();

Это, однако, возвращает 0 строк. Я что-то пропустил?

Ответы [ 3 ]

0 голосов
/ 29 августа 2018
  1. Элемент списка

    после преобразования кода sql в laravel

  2. DB :: выберите ( 'posts.id', 'posts.title', 'posts.body')

                                       ->from('posts')
                                    ->where('posts.author_id', '=', 1)
                                    ->orderBy('posts.published_at', 'DESC')
                                    ->limit(10)
                                    ->get();
    
0 голосов
/ 30 августа 2018

Попробуйте удалить эту строку:

->where('users.id', 'videos.tutor_id')
0 голосов
/ 29 августа 2018

Это должно быть что-то вроде ниже, хотя groupBy идентификатор пользователя не сильно помогает, так как идентификатор уникален.

$aggregates = [
    DB::raw('count(b.id) as  number_of_videos'),
    DB::raw('sum(b.vimeo_duration) as  total_duration'),
    DB::raw('sum(b.count_watched) as total_playbacks'),
];

$simpleSelects = ['users.email_address', users.id, 'users.name_first', 'users.name_last'];

$emails = ['candace_rennie@yahoo.com', 'tjm@hiltoncollege.com'....]

$users = Users::select(array_merge($simpleSelects, $aggregates))
    ->leftJoin('videos as b', function ($join) use ($emails) {
        $join->on('b.tutor_id', 'a.id')
            ->whereIn('users.email_address', $emails);
    })
    ->groupBy('users.id')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...