3

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

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

我想做的是:

总是急切地加载与当前用户语言翻译的“hasOne”关系。所以每当用户登录时,我的模型应该有类似$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. 在 trait 中使用构造函数:可以工作,但不是好主意,因为这可能会与其他 trait 的构造函数发生冲突。基本上我会确认声明:不要在任何特征中使用构造函数。

  2. 使用您的引导特征方法(bootHasTranslation),但我没有要调用的具体对象loadwith方法。我在实例化的 eloquent 模型中没有找到任何挂钩,我想在其中添加我的关系到急切的负载

有任何想法吗?我在这里忽略了什么明显的东西吗?

4

1 回答 1

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');
于 2016-12-09T09:35:15.173 回答