Как реализовать сложный запрос в eloquent?

Привет всем!
Недавно начал изучать laravel, решил сделать реализовать текущую задачу -- небольшой рекламный кабинет, -- но встала проблема с построением запроса в eloquent'е (вот тут коллеги помогли составить raw-запрос)

Собственно, суть вопроса: как скормить такое в laravel:
SELECT ads.*, COUNT(DISTINCT clicks.id) as clicks, COUNT(DISTINCT shows.id) as shows, (COUNT(DISTINCT clicks.id) * COUNT(DISTINCT shows.id))/100 as CTR
FROM ads
LEFT JOIN shows ON ads.id = shows.ad_id AND DATE(shows.created_at) = '2014-02-24'
LEFT JOIN clicks ON ads.id = clicks.ad_id AND DATE(clicks.created_at) = '2014-02-24'
GROUP BY ads.id;

Где дата -- это параметр.

Всем спасибо за подсказки, наводки, решения.
  • Вопрос задан
  • 5122 просмотра
Решения вопроса 1
Armanio
@Armanio Автор вопроса
$query = Ad::
select(array('ads.*', DB::raw('COUNT(DISTINCT clicks.id) as clicks_count'), DB::raw('COUNT(DISTINCT shows.id) as shows_count'), DB::raw('(COUNT(DISTINCT clicks.id) * COUNT(DISTINCT shows.id))/100 as CTR')))
->leftJoin('clicks', function($join) use($date){
	$join->on('ads.id', '=', 'clicks.ad_id')->where(DB::raw('DATE(clicks.created_at)'), '=', $date);
})
->leftJoin('shows', function($join) use($date){
	$join->on('ads.id', '=', 'shows.ad_id')->where(DB::raw('DATE(shows.created_at)'), '=', $date);
})
->groupBy('ads.id')->with('devices', 'platforms');

Подсчитывает просмотры, клики, цтр и возвращает инфу по платформам, девайсам.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
hell0w0rd
@hell0w0rd
Просто разработчик
SELECT ads.*, COUNT(DISTINCT clicks.id) as clicks, COUNT(DISTINCT shows.id) as shows, (COUNT(DISTINCT clicks.id) * COUNT(DISTINCT shows.id))/100 as CTR
FROM ads
LEFT JOIN shows ON ads.id = shows.ad_id
LEFT JOIN clicks ON ads.id = clicks.ad_id AND shows.created_at = clicks.created_at
WHERE shows.created_at = '2014-02-24'
GROUP BY ads.id

Я бы делал так. А в чем проблема в ларавеле? как пробовали?
AND в втором JOIN можно убрать в WHERE
Ответ написан
Ваш ответ на вопрос

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

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