2015-08-09 3 views
-1

Как я могу сделать этот запрос в Laravel Eloquent или Fluent?Laravel leftJoin AS

DUELS 
|id|userId1 | UserId2 
------------------------- 
|1|  1 | 4  | 
|2|  3 | 2  | 
|3|  2 | 1  | 
------------------------- 

USERS 
|id| firstName | 
---------------- 
|1| Bob  | 
|2| Hans | 
|3| Jerome | 
|3| Katy | 
---------------- 

запроса: получить имена пользователей в поединках, где пользователь с $ идент Участвуют:

SELECT u1.firstName AS user1FirstName, u2.firstName AS user2FirstName 
    FROM duels    
    LEFT JOIN users AS u1     
     ON userId1 = u1.id   
    LEFT JOIN users AS u2  
     ON userId2 = u2.id   
    WHERE userId1 = $userId || userId2 = $userId 
+0

Может вы _competition_ в этой ситуации, чтобы знать, что конкуренция между пользователями? –

+0

Извините, я не понимаю, что вы имеете в виду. – Bolko

+0

Я упомянул об этом, чтобы убедиться, что существует _competition_ между двумя пользователями (что на самом деле является дуэли). Вы пробовали подходы, о которых я упоминал в своем ответе? –

ответ

0

Использование Laravel свободно говорит, чтобы выполнить этот запрос вам нужно сделать следующее:

DB::table('users')->join('duels', function($join) use ($userId){ 
    $join->on('users.id', '=', 'duels.userId1') 
      ->orOn('users.id', '=', 'duels.userId2') 
      ->where('users.id', '=', $userId); 
})->get(); 

Использование Laravel-х Eloquent, однако, вы можете рассмотреть вопрос пользователя или как первого игрока, или как второй игрок. В вашей User модели определяют две вышеупомянутые отношения как таковые:

 class User extends Eloquent{ 

     /** 
     * ... 
     */ 

     public function duelsAsFirstPlayer(){ 
      return $this->belongsToMany('App\User', 'duels', 'user_id_1', 'user_id_2'); 
     } 

     public function duelsAsSecondPlayer(){ 
      return $this->belongsToMany('App\User', 'duels', 'user_id_2', 'user_id_1'); 
     }  
    } 

Теперь для того, чтобы получить всех пользователей пользователем с $userId имеет поединки с запрос к User модели как таковой:

, как первый игрок :

$users = App\User::find($userId)->duelsAsFirstPlayer()->get(); 

или второй игрок:

$users = App\User::find($userId)->duelsAsSecondPlayer()->get(); 
+0

Спасибо за ваше предложение, но я действительно хотел получить все поединки, в которых пользователь участвует с одним запросом :) – Bolko

+0

Я не думаю, что можно запросить две стороны отношения (если это один ко многим или многие-ко-многим) _ в один выстрел_ с использованием подхода ** Eloquent ** (и отображения в табличной форме). Поскольку пользователь будет участвовать либо в качестве _user 1_, либо _user 2_, вы должны принять это во внимание при запросе отношений «Красноречивое». Хотя, используя необработанные запросы, вы можете отображать результат в виде таблицы, отображающей пользовательские поединки. –

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