2015-01-12 3 views
0

Я использую систему аутентификации по умолчанию, которую предоставляет Laravel. Тем не менее, я хочу присоединиться к двум таблицам (выполнить два внутренних объединения) в моей таблице Auth (пользователи). До сих пор я создал две связи между двумя моделями, и это прекрасно работает, и я получаю данные, которые я хочу, однако он выполняет два дополнительных запроса, когда я думаю, что задним числом, выполняющим два соединения на столе, будет намного более эффективно.Laravel Join On Auth Table

То, что я не знаю, как это сделать, - это выполнить Объединение в пользовательской модели, чтобы мне не нужно было создавать новый запрос (а скорее использовать тот, который создается путем вызова Auth :: user ()).

Мои столы:

 Users: id username iconid avatarid
 Icons: id image
 Avatars: id image

Так что я хотел бы сделать, это:

 SELECT icons.image as icon_image, avatars.image as avatar_image FROM users 
    LEFT OUTER JOIN icons ON icons.id = users.iconid 
    LEFT OUTER JOIN avatars ON avatars.id = users.avatarid 

Возможно ли это? Нужно ли просто переписывать метод в моей модели User, чтобы Auth :: user() выполнил указанный выше запрос?

Спасибо всем, кто отвечает!

ответ

2

Put это в модели пользователя:

public function icon() 
{ 
    return $this->hasOne('Icon'); 
} 
public function avatar() 
{ 
    return $this->hasOne('Avatar'); 
} 

Затем получить пользователь, как это:

$user = User::with(['icon', 'avatar'])->find(1); 

Затем вы можете получить доступ к значку и аватара, как это:

$user->icon 

$user->avatar 

Для этого с помощью соединений вы можете сделать это:

$user_id = 1; 
DB::table('users') 
->join('icons', 'icons.id', '=', 'users.icon_id') 
->join('avatars', 'avatars.id', '=', 'users.avatar_id') 
->select('users.name', 'icons.path', 'avatars.path') 
->where('users.id', $user_id) 
->first(); 
+0

Это в значительной степени то, что я сделал, только он создает два дополнительных запроса вместо объединения таблиц в текущий. Значок Auth :: user() -> будет работать, но он создает два дополнительных запроса, которые я пытаюсь избежать. Я хочу, чтобы LEFT OUTER присоединился к таблицам на Auth. Я мог бы создать отдельный метод внутри модели User, но это не повлияет на вызов Auth :: user(). Спасибо за ваш ответ :) – Patchesoft

+0

Добавили пример с объединениями – Rupert

+1

В любом случае, чтобы манипулировать вызовом Auth :: user()? Где бы я поместил код SQL, чтобы Auth :: user() запускал код SQL соединения? Нужно ли переписывать метод в модели User? – Patchesoft