2015-01-13 3 views
4

Auth :: user() 쿼리에 조인을 추가하고 싶습니다. 새로운 쿼리를 만들지 않고 어떻게해야합니까?Laravel이 Auth :: user() 쿼리를 수정합니까?

SELECT * FROM `users` WHERE `id` = ?

SELECT * FROM users INNER JOIN user_icons ON user_icons.ID = users.iconid WHERE `id` = ?

에 나는 기본 모델 사용자 클래스를 사용하고 있습니다 : 난 그냥보다) 다른 인증의 기본 전화 : 사용자 (만들 수 있어야합니다.

+0

사용자 모델의 관계를 통해 처리해야합니다. – ceejayoz

+0

이것은 조인을 만들지 않지만 두 개의 별도 쿼리를 실행합니다. 가능한 한 많은 쿼리 호출을 피하려고합니다. – Patchesoft

+1

일반적으로 Laravel 방식으로하는 것이 좋습니다. 추가 쿼리를 수행 할 때 서버가 깜박 거리지 않아 코드 복잡성이 줄어들어 그만한 가치가 있습니다. – ceejayoz

답변

3

Laravel 당신이 Auth 기능을 확장 할 수있는 방법을 제공합니다. 먼저 Illuminate\Auth\UserProviderInterface을 구현하는 클래스를 만들어야합니다. 수업을 받으면 Auth::extend()으로 전화하여 Auth을 새 수업으로 구성하십시오.

귀하의 경우 가장 쉬운 방법은 Illuminate\Auth\EloquentUserProvider 확장 클래스를 만드는 것입니다. 사용자 지정 조인을 추가하려면 retrieveBy* 메서드를 업데이트해야합니다.

Auth::extend('eloquent', function($app) { 
    return new MyEloquentUserProvider($app['hash'], $app['config']['auth.model']); 
}); 

Auth::extend 메소드의 첫 번째 매개 변수로 사용되는 인증 드라이버의 이름입니다 클래스가 구체화되면

class MyEloquentUserProvider extends Illuminate\Auth\EloquentUserProvider { 
    public function retrieveById($identifier) { 
     return $this->createModel()->newQuery()->join(/*join params here*/)->find($identifier); 
    } 
    public function retrieveByToken($identifier, $token) { 
     // your code with join added here 
    } 
    public function retrieveByCredentials(array $credentials) 
     // your code with join added here 
    } 
} 

, 당신은 그것을 사용하는 인증 말할 필요 : 예를 들어, app/config/auth.php에 정의되어 있습니다. 원하는 경우 새 드라이버 (예 : 'myeloquent')를 만들 수 있지만 Auth::extend 문과 app/config/auth.php 드라이버를 업데이트해야합니다.

이 모든 작업이 완료되면 Auth::user()MyEloquentUserProvider::retrieveById 메서드로 끝납니다.

공정 경고 : 실제로이 작업을 수행하지 않았으며이 중 어느 것도 개인적으로 테스트하지 않았습니다. 아마도 문서 (L4.1 docs, L4.2 docs)를 확인하고 Laravel 코드를 살펴볼 수 있습니다.

기타 사항 :

  • 사람들은 이미 당신이 무엇을 원하는 아마 아니라고에서 울려왔다. 그러나이 정보는 다른 어떤 이유로 Auth를 확장하려는 사용자 및 다른 사용자에게 도움이 될 수 있습니다.
  • 내부 조인을 고려하면 사용자가 연결된 user_icons 레코드가없는 경우 Auth::user()은 더 이상 레코드를 반환하지 않으므로 사용자는 전혀 로그인 할 수 없습니다.
+0

많은 도움을 주셔서 감사합니다! – Patchesoft

+0

'Auth :: extend' 명령 줄은 어디에 두어야합니까? – Rashad

+1

@RiKo 일반적으로 서비스 프로 바이더의'boot()'메소드 안에 있습니다. – patricus

1

당신이 한 경우 : N 관계 :

는 외래 키 "USER_ID"함께 데이터베이스에 "아이콘"테이블을 추가합니다.

"아이콘"모델을 모델에 추가하십시오.

모델 클래스 "사용자"에서
<?php 

class Icon extends Eloquent{ 

    ... 

} 
?> 

기능을 추가

public function icons() { 
    return $this->hasMany('Icon'); 
} 

지금 당신은이 작업을 수행 할 수 있습니다

$userIcons = Auth::user()->icons(); 
+1

'Auth :: user() -> icons()'는 어떤 아이콘도 반환하지 않고 쿼리를 반환한다는 것을 기억하십시오. –

+0

이것은 조인을 생성하지 않지만 두 개의 별도 쿼리를 실행합니다. 가능한 한 많은 쿼리 호출을 피하려고합니다. – Patchesoft

관련 문제