在雄辩的模型中使用特征时总是渴望加载关系

时间:2016-12-09 08:57:17

标签: php laravel laravel-5 traits laravel-eloquent

我为任何一个雄辩的模特提供HasTranslation - 特质。使用此特征的所有模型都将获得这样的一对多关系(您可以在其中看到我的基本Model to ModelLanguages关系):

public function languages()
{
    return $this->hasMany(get_class($this).'Lang', 'master_id', 'id');
}

我想做的是:

始终急切地使用当前用户语言的翻译加载“hasOne”-relationship 。因此,每当用户登录时,我的模型应该像$model->userLanguage一样急切加载并且类型为ModelLang

这看起来像这样,效果很好:

public function userLanguage()
{
    $user = \Auth::user();

    if (!$user)
    {
        throw new \Exception(__CLASS__.': userLanguage not available because there is no session');
    }

    return $this->hasOne(get_class($this).'Lang', 'master_id', 'id')->where('language_id', $user->language_id);
}

我正在努力通过仅仅包含这个特性来自动(急切地)为所有模型加载这种关系。

到目前为止我尝试了什么

  1. 在特征中使用构造函数:可以工作,但没有好主意,因为这可能会与其他特征的构造器发生冲突。基本上我确认声明:不要在任何特征中使用构造函数。

  2. 使用boot-Trait方法(bootHasTranslation),但我没有具体的对象来调用loadwith方法。我没有找到任何钩子进入实例化的雄辩模型,我想将我的关系添加到急切负载

  3. 有什么想法吗?有没有明显的东西我在这里忽略了?

1 个答案:

答案 0 :(得分:0)

您可以为登录的用户语言创建中间件。

public function handle($request, Closure $next)
{   

    if (!Auth::check()) {
      return redirect('/')->with('Success','You have successfully logged out');    
    }

    $user = \Auth::user();

    $language =  $user->languages()->where('language_id', $user->language_id);

    $request->attributes->add([
        'user_language' => $language
    ]);

    $next($request);
}

您可以在像

这样的中间件之后获取此数据
$request->attributes->get('user_language');