Laravel 修改 Auth::user() 查询?

Laravel modify Auth::user() query?

我想在我的 Auth::user() 查询中添加一些联接。如何在不创建全新查询的情况下执行此操作?我只是希望能够使 Auth::user() 的默认调用不同于:

    SELECT * FROM `users` WHERE `id` = ?

    SELECT * FROM users INNER JOIN user_icons ON user_icons.ID = users.iconid WHERE `id` = ? 

我使用的是默认模型用户 class。

如果你有 1:n 关系:

使用外键 "user_id".

向您的数据库添加 "icons" table

为您的模型添加 "Icon" 个模型。

<?php

class Icon extends Eloquent{

  ...

}
?>

在模型Class中"User"添加一个函数:

public function icons() {
    return $this->hasMany('Icon');
}

现在您可以这样做了:

$userIcons = Auth::user()->icons();

Laravel 为您提供了一种扩展 Auth 功能的方法。首先,您需要创建一个实现 Illuminate\Auth\UserProviderInterface 的 class。获得 class 后,您可以调用 Auth::extend() 使用新的 class.

配置 Auth

对于您的情况,最简单的方法是创建一个扩展 Illuminate\Auth\EloquentUserProvider 的 class。您需要更新 retrieveBy* 方法以添加自定义联接。例如:

class MyEloquentUserProvider extends Illuminate\Auth\EloquentUserProvider {
    public function retrieveById($identifier) {
        return $this->createModel()->newQuery()->join(/*join params here*/)->find($identifier);
    }
    public function retrieveByToken($identifier, $token) {
        // your code with join added here
    }
    public function retrieveByCredentials(array $credentials)
        // your code with join added here
    }
}

一旦你的 class 充实了,你需要告诉 Auth 使用它:

Auth::extend('eloquent', function($app) {
    return new MyEloquentUserProvider($app['hash'], $app['config']['auth.model']);
});

Auth::extend 方法的第一个参数是 app/config/auth.php 中定义的正在使用的 auth 驱动程序的名称。如果需要,您可以创建一个新驱动程序(例如 'myeloquent'),但您需要更新 Auth::extend 语句和 app/config/auth.php 驱动程序。

完成所有这些后,Auth::user() 将最终调用您的 MyEloquentUserProvider::retrieveById 方法。

中肯警告:我自己并没有真正做到这一点,none 这是我亲自测试过的。您可能需要查看文档 (L4.1 docs, L4.2 docs) 并查看 Laravel 代码。

其他说明:

  • 人们已经表示这可能不是您想要做的。但是,此信息可能对您和出于其他原因希望扩展 Auth 的其他人有所帮助。
  • 考虑到您的内部联接,如果用户没有关联的 user_icons 记录,Auth::user() 将不再有 return 记录,并且该用户可能无法完全登录。