2017-02-19 4 views
0

У меня есть следующий запрос: MySQLMySQL запросов к Laravel красноречивый

SELECT 
    * 
FROM 
    news_posts 
WHERE 
    user_id = ? 
     AND id NOT IN (SELECT 
      post_id 
     FROM 
      user_read 
     WHERE 
      user_id = ?) 

Я хочу, чтобы сделать его более «красноречивый». Я попытался следующие, но его (очевидно) не работает:

NewsPost::where('user_id', Auth::id()) 
    ->whereNotIn(function ($query) { 
     $query->DB::table('user_read') 
      ->select('post_id') 
      ->where('user_id', Auth::id()); 
    })->get(); 
+1

С вами вы 'WhereNotIn' метод вы не указали имя столбца. Что это должно быть? Кроме того, я предполагаю, что вы получаете сообщение об ошибке: '$ query-> DB :: table' –

+0

@RossWilson Да. Спасибо! =) получил его работу –

ответ

0

Спасибо за все ответы! Понял работает со следующими ухищрений:

NewsPost::where('user_id', Auth::id()) 
       ->whereNotIn('id', function ($query) { 
       $query->select('post_id') 
       ->from('user_read') 
       ->where('user_id', Auth::id()); 
      }) 
      ->get(); 
0

Я предполагаю, что «где» метод выполняет простой SQL запрос таблицы "new_posts. Можете ли вы попытаться переписать этот запрос и позволить mysql делать фильтрацию для новых сообщений? (поиск LEFT OUTER JOIN on mysql)

SELECT * 
FROM news_posts a 
JOIN user_read b 
ON a.id = b.post_id 
WHERE a.user_id = ? 
AND b.post_id IS NULL; 
+0

Ну, я не думаю, что присоединиться к ним - это то, что я хочу сделать. Я хочу удалить все сообщения из user_read из news_posts. Таким образом оставляя только непрочитанные сообщения ... если это имеет смысл ... –

+0

См. Https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ для 'Left Oute Join'. –

Смежные вопросы