php - 在 Eloquent 模型中使用特征时总是渴望加载关系

标签 php laravel laravel-5 traits eloquent

我正在为我的任何 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);
}

我正在努力尝试通过仅包含此特征来自动(渴望)为所有模型加载此关系。

到目前为止我尝试了什么

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

  2. 使用您的 boot-Trait 方法 (bootHasTranslation) 但我没有具体的对象来调用 loadwith方法上。我没有在实例化的 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/

相关文章:

php - 查看上次访问目录 php 的日期

PHP MySQL错误设置

curl - Laravel 项目使用来自另一个项目的 .env 变量

PHP简单翻译方法——你的看法

php - 从 Laravel 4 Controller 执行 Python 脚本

laravel - 如何从Laravel的现有Docker环境中创建Docker镜像,LAravel应用程序的Dockerfile

mysql - 在查询生成器中查询不同的行

laravel-5 - Laravel 集成测试在作为一个类运行时抛出虚假的 404 错误,个​​别测试工作正常

php - 如何在 Laravel 中将 stdClass 的对象转换为数组

php - DataTable 格式化表中的日期时间列