2016-12-01 123 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