2015-09-17 3 views
0

Я хочу, чтобы преобразовать этот запрос красноречив:Laravel 4: Сырое Запрос на красноречивые

SELECT * 
FROM news 
WHERE who_see='6' 
    OR (news.id_user IN 
     (SELECT id_user 
     FROM koneksi_user 
     WHERE to_id_user='$user->id_user' 
      AND confirmed='0') 
     OR news.id_user IN 
     (SELECT to_id_user 
     FROM koneksi_user 
     WHERE id_user='$user->id_user' 
      AND confirmed='0'))) 
ORDER BY created_at DESC 

До сих пор я пытался это:

$user = \Auth::user(); 

return \DB::table('news') 
     ->where('who_see','6') 
     ->orWhereIn('news.id_user', function($query) 
      { 
       $query->select('id_user') 
       ->from('koneksi_user') 
       ->whereRaw('to_id_user = $user->id_user'); 
      }) 
     ->orWhereIn('news.id_user', function($query2) 
      { 
       $query2->select('id_user') 
       ->from('koneksi_user') 
       ->whereRaw('id_user = $user->id_user'); 
      }) 
     ->get(); 

Но я получаю эту ошибку:

SQLSTATE[42601]: Syntax error: 7 ERROR: 'sintaks error' pada atau didekat « $ » LINE 1: ... "id_user" from "koneksi_user" where to_id_user = $user->id_...^(SQL: select * from "news" where "who_see" = 6 or "news"."id_user" in (select "id_user" from "koneksi_user" where to_id_user = $user->id_user) or "news"."id_user" in (select "id_user" from "koneksi_user" where id_user = $user->id_user))

Как это исправить?

+0

Итак, вы просто хотите получить решение? Покажите нам, что вы пробовали до сих пор. – Bogdan

+0

возврата \ Статус :: с ('любит') \t \t \t -> с ('') user.profil.foto \t \t \t -> с ('Фото') \t \t \t -> с ('комментарии .owner.profil.фото ') \t \t \t -> с (' ') comments.like \t \t \t // -> где (' who_see '[6, $ user-> id_user_group]) \t \t \t -> orWhereIn (' who_see ', [6, $ user-> id_user_group]) \t \t \t -> orWhereIn (' news.id_user ', "array ([select id_user from koneksi_user, где to_id_user = $ user-> id_user и подтверждено =' 0 ']) ") \t \t \t -> OrderBy ('created_at', 'по убыванию') \t \t \t -> постраничной (20); –

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что этот вопрос относится к разнообразию «gimme hte codez». –

ответ

0

Основная проблема, которую я могу видеть (что также является один в сообщении об ошибке) является с этим:

->whereRaw('to_id_user = $user->id_user') 

Это будет генерировать SQL-код, как WHERE to_id_user = $user->id_user, который является недействительным SQL.

Первая проблема заключается в том, что у вас есть переменные PHP внутри строки с одним кавычком. Это означает, что они не будут рассматриваться как переменные и будут просто рассматриваться как часть строки; они не будут разбираться.

Это можно было бы решить, изменив его на строку с двумя кавычками, но это не лучшее исправление в этом случае, потому что я не понимаю, почему вы используете whereRaw() здесь вообще. Похоже, что вы должны просто использовать where() вместо:

->where('to_id_user', $user->id_user) 

Заменить обе whereRaw() вызовы с where() вызовов, и посмотреть, если это помогает.

0

У вас почти было это работает. Проблема с кодом является то, что вы пытались использовать whereRaw для двух условий, но включены фактические имя переменной внутри строки, а это значит, что:

->whereRaw('to_id_user = $user->id_user'); 

создаст этот SQL условие:

WHERE to_id_user = $user->id_user 

, поэтому он просто использует строку буквально $user->id_user вместо фактического значения ID. Чтобы исправить, что вы просто должны использовать обычный метод where:

->where('to_id_user', $user->id_user); 

Полный Query Builder код, который будет генерировать SQL запрос, который вы ищете, должен выглядеть следующим образом:

\DB::table('news') 
    ->where('who_see', '6') 
    ->orWhereIn('news.id_user', function($query) { 
     $query->select('id_user') 
      ->from('koneksi_user') 
      ->where('to_id_user', $user->id_user) 
      ->where('confirmed', 0); 
    }) 
    ->orWhereIn('news.id_user', function($query2) { 
     $query2->select('id_user') 
       ->from('koneksi_user') 
       ->where('id_user', $user->id_user) 
       ->where('confirmed', 0); 
    }) 
    ->orderBy('created_at', 'desc') 
    ->get(); 

И для дальнейшего использования, если по какой-либо причине вы хотите/должны использовать whereRaw и передавать переменные состояния, вы должны использовать привязки, чтобы избежать SQL Injection:

->whereRaw('to_id_user = ?', [$user->id_user]);