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。