2016-12-01 68 views
0

感謝您的時間提前。如果您匆忙,請跳至粗體部分。Laravel 5.3雄辯的模型動態表格屬性

我有一個下面的用例:應用程序的每個用戶都使用他自己的一套前綴表格作爲Eloquent模型(即Code_invoices的Invoice.php和Code_clients的Client.php)。前綴在用戶表中定義(例如users.code)。

在Laravel 5.2我已經能夠通過讀取用戶登錄後運行時設置的配置(或會話)變量,輕鬆設置Eloquent模型的$ table屬性。一切正常,包括關係。

但是5.3更新後,在運行時設置的任何配置值現在都會在對象中返回null(與會話值一樣)。我從文檔中知道會話在構造函數中不可用,並且建議的解決方法是中間件閉包,但Eloquent類不能使用中間件閉包,因爲它會返回未定義的方法錯誤。

所以我的問題是雙重的:我如何動態設置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

OK,所以任何人都面臨着同樣的問題,這是我的解決辦法,我相信它的清潔ENO唉:

在登錄控制器,而不是試圖挽救運行時配置變量或會話值,並返回一個請求,我已經與閃存數據重定向:return redirect()->intended('dashboard')->with('company_code', $user->company_code);(注意我的$用戶的那insetad > company_code你可以設置你需要傳遞給會話的任何東西) 然後在用戶模型(User.php)中,我檢查了那個閃存數據,並將它永久存儲在會話中。之後,我能夠在我的所有模型中獲得永久密鑰。我使用過用戶模型,因爲我確定它會在我的其他模型之前加載,因爲它是Auth中間件的一部分。

我認爲原始方法(在登錄方法中存儲會話或配置)的問題是模型在中間件運行之前加載,所以該值返回null。使用redirect()->with()您將再添加一個請求週期,然後在模型加載之前設置該值。

我希望這有助於某人,因爲在我想到這之前,我正要恢復到Laravel 5.1。

0

我使用這樣一個真正可怕的用例:

/** 
* 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

對於從配置可以做到這一點閱讀:$value = config('app.timezone'); 閱讀documentation更多

,並設置$table你做CAND這個模型:

protected $table = 'my_flights'; 
+0

就像我告訴過你的,config('app.whateverSetOnRuntime')返回null在模型中。看起來,運行時配置變量不會在請求之間持續存在。 – quiq

+0

@quiq如果您需要保留的值與用戶的會話相關,那麼這就是它應該存儲的位置。這在你的用例中是可行的嗎? – markdwhite

+0

這是應用程序在5.3更新之前的工作方式。用戶登錄後,我將他的前綴代碼保存在會話中,然後在模型中獲取它,並設置$ table屬性,並且它都是漂亮的。然而,session('anyruntimevalue')或config('anyruntimevalue')現在在模型中返回null。我不願回到5.2,因爲我需要繼續開發這個應用程序的時間來。 – quiq