我正在为我的任何 eloquent 模型提供 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);
}
我正在努力尝试通过仅包含此特征来自动(渴望)为所有模型加载此关系。
到目前为止我尝试了什么
在 trait 中使用构造函数:可以工作,但不是好主意,因为这会与其他 trait 的构造函数发生冲突。基本上我会确认以下声明:不要在任何特征中使用构造函数。
使用您的 boot-Trait 方法 (
bootHasTranslation
) 但我没有具体的对象来调用load
或with
方法上。我没有在实例化的 Eloquent 模型中找到任何 Hook ,我想在其中添加与急切加载的关系
有什么想法吗?有什么明显的我在这里忽略了吗?
最佳答案
您可以为登录的用户语言创建一个中间件。
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');
关于php - 在 Eloquent 模型中使用特征时总是渴望加载关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056576/