2016-03-18 7 views
0

Я был на этом несколько часов без решения. Я думал о laravel отношениях, но не знаю, как передать второе условие, потому что мне нужно связать с 3 таблицами. Я хотел бы использовать запрос ниже в laravel.Сложный INNER JOIN Mysql Query From 3 Tables in Laravel

SELECT 
subscriptions.subscribed_to, 
broadcasts. *, 
FROM subscriptions 
INNER JOIN broadcasts 
WHERE subscriptions.subscriber = {$user_id} 
AND (
    SELECT COUNT(*) FROM seen_broadcasts 
    WHERE user_id = {$user_id} 
    AND broadcast_id = broadcasts.id 
) = 0 
ORDER BY broadcast.date DESC 

Есть 3 стола.

  1. подписки: subscriber_id выписывает broadcaster_id.
  2. радиопередачи: где сообщение радиостанции сохраняется.
  3. seen_broadcast: где информация подписчиков сохраняется при чтении трансляции. Это помогает нам предоставлять подробную статистику для вещателя. user_id = subscriber_user_id, broadcast_id = broadcast_message_id

Я хочу, чтобы иметь возможность получать трансляции со всех вещателей, на которых пользователь подписался и не видел.

Запрос выше в настоящее время работает вне laravel.

+0

Операции CREATE и INSERT И желаемый результат – Strawberry

+0

Есть 3 таблицы. 1. подписки: подписчик подписывается на broadcaster_id 2. трансляции: там, где сохраняется сообщение телеканала 3: seen_broadcast: где информация подписчиков сохраняется при чтении трансляции. Это помогает нам предоставлять подробную статистику для вещателя. 'user_id = subscriber_user_id, broadcast_id = broadcast_message_id' Я хочу иметь возможность получать трансляции со всей вещательной компании, на которой пользователь подписался и не видел. Я надеюсь, что это достаточно ясно – Overcomer

+0

Я думаю, что вам не хватает ключевых полей, которые внутренние ссылки соединения на table1 inner join table2 на table1.field = table2.field – ChelseaStats

ответ

1

После долгих отписок, я закончил с этим:

$broadcast_result = DB::select(DB::raw(" 
             SELECT 
             subscriptions.subscribed_to, 
             broadcasts.* 
             FROM subscriptions 
             INNER JOIN broadcasts 
             WHERE subscriptions.browser_agent_id = :subsc_id 
             AND broadcasts.user_id = subscriptions.subscribed_to 
             AND (
              SELECT COUNT(*) FROM broadcasts_seen 
              WHERE broadcast_id = broadcasts.id 
              AND subscriber_id = subscriptions.subscriber_id 
             ) = 0 
             ORDER BY broadcasts.date DESC LIMIT 1 
            "), array(
             'subsc_id' => $subscriber->id 
            )); 
$broadcast_set = $broadcast_result[0]; 

Также добавьте use DB; в контроллере.

Если есть лучший способ сделать это, пожалуйста, поделитесь.

+0

Без правильной схемы и мы имеем ограниченные средства для оценки этого ответа. Если это сработает для вас, тогда здорово, но вы также можете сохранить эту информацию и для себя. – Strawberry

+1

Вы можете использовать отношения, но в вашем случае он отправит много запросов в db. Так что для вашего дела сделать это все нормально. Но я предпочитаю хранить дополнительную таблицу для сбора статистики и т. Д., Используя задания в laravel. – num8er