Laravel 5.3 Eloquent 模型动态 Table 属性
Laravel 5.3 Eloquent Model Dynamic Table Property
提前感谢您抽出时间。如果您赶时间,请跳至粗体部分。
我有以下用例:该应用程序的每个用户都使用自己的一组前缀 table 用于 Eloquent 模型(即 Invoice.php 用于 code_invoices 和Client.php 对于 code_clients)。前缀在用户 table 中定义(例如 users.code)。
在 Laravel 5.2 中,我可以通过读取配置(或会话)变量设置来轻松设置 Eloquent 模型的 $table 属性用户登录后运行。一切正常,包括关系。
但是在 5.3 更新后,在运行时设置的任何配置值现在在对象中 returns 为空(会话值也是如此)。我从文档中了解到会话现在在构造函数中不可用,建议的解决方法是中间件闭包,但是 Eloquent 类 不能使用中间件闭包,因为它 returns未定义的方法错误。
所以我的问题有两个:如何动态设置 Eloquent 的 $table 属性 和/或如何读取模型中的运行时配置值。
如有任何帮助,我们将不胜感激。
编辑:
我可以使用 from()
方法为模型指定 table。
这有效:
$model = \App\ModelName::from('prefix_table')->first();
但我真正的问题是关系。
这不起作用:
$model = \App\ModelName::from('prefix_table')->with('relatedModel')->first()
不会,因为相关模型不知道使用什么 table 前缀。
有趣吧? :)
我在一个非常糟糕的用例中使用了这样的东西:
/**
* 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();
}
要从配置中读取,您可以这样做:$value = config('app.timezone');
阅读documentation了解更多
并设置 $table
你可以在模型中这样做:
protected $table = 'my_flights';
好的,对于遇到同样问题的其他人,这是我的解决方法,我相信它足够干净:
在登录控制器中,我没有尝试保存 运行 时间配置变量或会话值和 return 下一个请求,而是 使用闪存数据重定向: return redirect()->intended('dashboard')->with('company_code', $user->company_code);
(注意我的 $user->company_code 的 insetad 你可以设置任何你需要传递给会话的东西)
然后在用户模型 (User.php) 中,我检查了闪存数据,并将其永久存储在会话中。之后,我就能够在我的所有模型中获得该永久密钥。我使用了用户模型,因为我确信它会在我的任何其他模型之前加载,因为它是 Auth 中间件的一部分。
我认为原来的做法(在login方法中存储session或config)的问题是model是在中间件有运行之前加载的,所以return的值是null。使用 redirect()->with()
,您将再添加一个请求周期,然后在加载模型之前设置该值。
我希望这对某人有所帮助,因为在我想到这个之前我正要恢复到 Laravel 5.1。
提前感谢您抽出时间。如果您赶时间,请跳至粗体部分。
我有以下用例:该应用程序的每个用户都使用自己的一组前缀 table 用于 Eloquent 模型(即 Invoice.php 用于 code_invoices 和Client.php 对于 code_clients)。前缀在用户 table 中定义(例如 users.code)。
在 Laravel 5.2 中,我可以通过读取配置(或会话)变量设置来轻松设置 Eloquent 模型的 $table 属性用户登录后运行。一切正常,包括关系。
但是在 5.3 更新后,在运行时设置的任何配置值现在在对象中 returns 为空(会话值也是如此)。我从文档中了解到会话现在在构造函数中不可用,建议的解决方法是中间件闭包,但是 Eloquent 类 不能使用中间件闭包,因为它 returns未定义的方法错误。
所以我的问题有两个:如何动态设置 Eloquent 的 $table 属性 和/或如何读取模型中的运行时配置值。
如有任何帮助,我们将不胜感激。
编辑:
我可以使用 from()
方法为模型指定 table。
这有效:
$model = \App\ModelName::from('prefix_table')->first();
但我真正的问题是关系。
这不起作用:
$model = \App\ModelName::from('prefix_table')->with('relatedModel')->first()
不会,因为相关模型不知道使用什么 table 前缀。
有趣吧? :)
我在一个非常糟糕的用例中使用了这样的东西:
/**
* 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();
}
要从配置中读取,您可以这样做:$value = config('app.timezone');
阅读documentation了解更多
并设置 $table
你可以在模型中这样做:
protected $table = 'my_flights';
好的,对于遇到同样问题的其他人,这是我的解决方法,我相信它足够干净:
在登录控制器中,我没有尝试保存 运行 时间配置变量或会话值和 return 下一个请求,而是 使用闪存数据重定向: return redirect()->intended('dashboard')->with('company_code', $user->company_code);
(注意我的 $user->company_code 的 insetad 你可以设置任何你需要传递给会话的东西)
然后在用户模型 (User.php) 中,我检查了闪存数据,并将其永久存储在会话中。之后,我就能够在我的所有模型中获得该永久密钥。我使用了用户模型,因为我确信它会在我的任何其他模型之前加载,因为它是 Auth 中间件的一部分。
我认为原来的做法(在login方法中存储session或config)的问题是model是在中间件有运行之前加载的,所以return的值是null。使用 redirect()->with()
,您将再添加一个请求周期,然后在加载模型之前设置该值。
我希望这对某人有所帮助,因为在我想到这个之前我正要恢复到 Laravel 5.1。