2016-12-01 2 views
0

미리 감사드립니다. 바쁘다면 굵은 글씨로 건너 뜁니다.Laravel 5.3 Eloquent Model 동적 테이블 속성

다음 사례가 있습니다. 앱의 모든 사용자는 Eloquent Models (즉, code_invoices의 경우 Invoice.php, code_clients의 경우 Client.php)에 대해 고유 한 접두사 테이블 집합을 사용합니다. 접두사는 사용자 테이블 (예 : users.code)에 정의됩니다.

Laravel 5.2 나는 사용자가 로그인 한 후에 런타임에 설정 한 config (또는 session) 변수를 읽음으로써 Eloquent 모델의 $ table 속성을 쉽게 설정할 수있었습니다. 관계를 포함하여 모든 것이 잘 작동했습니다.

그러나 5.3 업데이트 후에는 런타임에 설정된 모든 구성 값이 세션 값과 마찬가지로 개체에서 null을 반환합니다. 문서에서 생성자에서 세션을 사용할 수 없다는 것을 알고 있으며 제안 된 해결 방법은 미들웨어 클로저이지만 미등록 클래스는 미정의 메서드 오류를 반환하므로 미들웨어 클로저를 사용할 수 없습니다.

그래서 내 질문은 동적으로 Eloquent의 $ table 속성을 설정하거나 모델의 런타임 구성 값을 읽는 방법입니다.

도움을 주시면 감사하겠습니다.

편집 : from() 메서드를 사용하여 모델의 테이블을 지정할 수 있습니다. 작동 방식 : $model = \App\ModelName::from('prefix_table')->first(); 하지만 내 진짜 문제는 관계입니다. 이것은 작동하지 않습니다 : $model = \App\ModelName::from('prefix_table')->with('relatedModel')->first() 관련 모델이 사용할 테이블 접두어를 알지 못하기 때문에 그렇지 않습니다.

흥미 롭습니까? :)

+0

아마도이 경우 DB :: setTablePrefix ($ prefix)'가 도움이 될 수 있습니다. – geoandri

답변

0

다른 사람이 동일한 문제를 겪고있는 경우이 문제는 내 해결 방법이며 깨끗한 것 같습니다. 우 : 로그인 컨트롤러에서

, 대신 다음 요청을 런타임 구성 변수 나 세션 값을 저장하고 반환하려고, 나는 플래시 데이터로 리디렉션 했습니다 : return redirect()->intended('dashboard')->with('company_code', $user->company_code);이 (내 $의 사용자 -의 insetad주의 > company_code 당신이 세션에 전달할 필요가 뭐든 설정할 수 있습니다) 다음 사용자의 모델 (User.php)에서 해당 플래시 데이터를 확인하고 세션에 영구적으로 저장됩니다. 그 후 나는 모든 모델에서 영구 키를 얻을 수있었습니다. Auth 미들웨어의 일부이기 때문에 다른 모델보다 먼저로드 될 것이기 때문에 User 모델을 사용했습니다.

원래 접근법 (로그인 메소드에 세션 또는 구성 저장)의 문제점은 미들웨어가 실행되기 전에 모델이로드되어 값이 null을 반환한다는 것입니다. redirect()->with()을 사용하면 요청주기를 한 번 더 추가 한 다음 모델이로드되기 전에 값이 설정됩니다.

내가 이것을 생각하기에 앞서 Laravel 5.1로 되돌아 가려고 했으므로 이것이 도움이되기를 바랍니다.

0

내가 정말 끔찍한 사용 사례에 대한이 같은 것을 사용 : $value = config('app.timezone');

에 대한 documentation를 읽고 당신이 모시 $table을 설정 :이 작업을 수행 할 수 있습니다 config (설정)에서 독서를 들어

/** 
* Override to allow different servers to use different tables 
* 
* @return string 
*/ 
public function getTable() 
{ 
    if (is_null($this->table)) { 
     if (str_contains(config('database.mysql.host'), 'SOMETHING_DIFFERENT')) { 
      $this->table = 'database1.sales_rank'; 
     } else { 
      $this->table = 'database2.sales_rank'; 
     } 
    } 
    return parent::getTable(); 
} 
+0

이 방법이 효과적 일 수 있으며, '$ model = \ App \ ModelName :: from ('prefixed_table) -> first();'와 같이 더 편리하게 사용할 수 있습니다. 관계가 작동하지 않습니다. 내 진짜 문제. – quiq

+0

@quiq - 실제 문제는 질문에 속하며 실제 답변을 얻는 데 도움이됩니다 .-) 그리고 내 접근 방식은 관계 (5.1 여기)와 함께 작동하지만 config() 문제는 직접 env()에 액세스하여 해결할 수 있습니다. 조금 너무 못생긴다. 꽤 작동하지 않으면 때때로 추한 작품. – markdwhite

+0

5.1에서 Eloquent 모델의 런타임에 설정된 config ('app.value')를 읽을 수있었습니다. 그러나 5.3에서는 작동하지 않습니다. 그것은 런타임에 설정할 필요가 있기 때문에 그것은 env에있을 수 없습니다, 애플 리케이션의 모든 사용자는 접두사 테이블의 다른 세트가 있습니다. 그것은 소리만큼 많은 테이블/사용자가 아닙니다. – quiq

1

이 모델의 :

+0

내가 말했듯이, config ('app.whateverSetOnRuntime')은 모델에서 null을 반환합니다. 그것은 런타임 구성 vars 요청 사이에 유지되지 않는 것 같습니다. – quiq

+0

@quiq 유지해야 할 값이 사용자의 세션과 관련이 있으면 저장해야하는 값입니다. 귀하의 유스 케이스에서 그럴 수 있습니까? – markdwhite

+0

5.3 업데이트 전에 앱이 작동하는 방식이었습니다. 사용자가 로그인하고 세션에서 접두사 코드를 저장 한 다음 모델에서 가져 와서 $ table 속성을 설정하면 모든 멋쟁이가되었습니다. 그러나 session ('anyruntimevalue') 또는 config ('anyruntimevalue')는 이제 모델에서 null을 반환합니다. 나는이 앱을 앞으로도 계속 개발할 필요가 있기 때문에 5.2로 돌아 가기를 꺼린다. – quiq

관련 문제