Php 在雄辩模型中使用特征时始终渴望负荷关系

Php 在雄辩模型中使用特征时始终渴望负荷关系,php,laravel,laravel-5,traits,laravel-eloquent,Php,Laravel,Laravel 5,Traits,Laravel Eloquent,我为我的任何一个雄辩的模型提供了一个hasstranslation-特征。所有使用此特性的模型都将收到如下一对多关系(您可以看到我的基本模型到模型语言的关系): 我想做的是: 始终渴望加载“hasOne”-与当前用户语言翻译的关系。因此,每当用户登录时,我的模型都应该加载类似于$model->userLanguage的内容,并且类型为ModelLang 这看起来像这样,效果很好: public function userLanguage() { $user = \Auth::user()

我为我的任何一个雄辩的模型提供了一个
hasstranslation
-特征。所有使用此特性的模型都将收到如下一对多关系(您可以看到我的基本模型到模型语言的关系):

我想做的是:

始终渴望加载“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);
}
我正在努力通过包含这个特性来自动(急切地)加载所有模型的这种关系

我到目前为止所做的尝试

  • 在trait中使用构造函数:可以工作,但没有好主意,因为这可能会与其他trait的构造函数冲突。基本上我会确认这句话:不要在任何特性中使用构造函数

  • 使用您的引导特征方法(
    boothastransflation
    ),但在那里我没有具体的对象来调用
    load
    方法。在实例化的雄辩模型中,我没有找到任何钩子,我想将我的关系添加到渴望的负载中


  • 有什么想法吗?有什么明显的地方我忽略了吗?

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

    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');
    

    谢谢你的回答,但我想这是另一个问题的答案;)我的示例中已经有了用户的语言
    $user->language\u id
    。我想要的是渴望加载关系!您可以在您的trait中创建一个始终使用('userLanguage')
    $request->attributes->get('user_language');