2014-11-24 2 views
0

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

Позвольте мне объяснить, у меня есть эта таблица:

select negotiation_id, status_id from negotiations_statuses; 
+----------------+-----------+ 
| negotiation_id | status_id | 
+----------------+-----------+ 
|    1 |   1 | 
|    2 |   1 | 
|    3 |   1 | 
|    4 |   1 | 
|    5 |   1 | 
|    6 |   1 | 
+----------------+-----------+ 

И эту таблицу:

select * from statuses; 
+----+------------+ 
| id | name  | 
+----+------------+ 
| 1 | open  | 
| 2 | in_process | 
| 3 | completed | 
| 4 | rejected | 
+----+------------+ 

Я хочу, чтобы выбрать переговоры, которые не являются completed или rejected.

Это то, что я пробовал:

$items = DB::table('negotiations') 
      ->join('negotiations_statuses', 'negotiations.id', '=', 'negotiations_statuses.negotiation_id') 
      ->where('user_id', '=', Auth::user()->id) 
      ->where('status_id', '!=', '3') 
      ->where('status_id', '!=', '4') 
      ->get(); 

Это работает, но я явно обман, потому что я использую status_id непосредственно. Как я могу сделать такой вложенный запрос?

+0

Вы хотите использовать вспомогательный запрос или вложенный запрос? – JMc

+0

вложенной запрос – dabadaba

ответ

0
$items = DB::table('negotiations') 
     ->join('negotiations_statuses', 'negotiations.id', '=','negotiations_statuses.negotiation_id') 
     ->whereNotExists(function($query){ 
      $query->where('status_id', '<>', 3) 
        ->where('status_id', '<>', 4); 
     }) 
     ->get(); 

Этот запрос получит все предметы, которые не были заполнены или отклонены.

Примечание: Это не было протестировано.

+0

не работает: SQLSTATE [42000]: ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'где 'status_id' <>? и 'status_id' <>?) 'в строке 1 (SQL: select * from' negot' inner join 'negot_statuses' на' negot'''''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' существует (выберите * где 'status_id' <> 3 и' status_id' <> 4)) – dabadaba

+0

тоже это не то, что я пытаюсь сделать, я пытаюсь сравнить имя статуса, а не значение ... – dabadaba

+0

Okay , Кажется, достаточно легко. Об ошибке, можете ли вы изменить <> на! = И посмотреть, есть ли у вас такая же ошибка? – JMc

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