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

Pat*_*oft 5 php mysql join laravel

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

    SELECT * FROM `users` WHERE `id` = ?
Run Code Online (Sandbox Code Playgroud)

    SELECT * FROM users INNER JOIN user_icons ON user_icons.ID = users.iconid WHERE `id` = ? 
Run Code Online (Sandbox Code Playgroud)

我正在使用默认模型User类.

pat*_*cus 5

Laravel 为您提供了一种扩展Auth功能的方法。首先,您需要创建一个实现Illuminate\Auth\UserProviderInterface. 一旦你有了你的课程,你就打电话Auth::extend()来配置Auth你的新课程。

对于您的情况,您要做的最简单的事情是创建一个扩展Illuminate\Auth\EloquentUserProvider. 您需要更新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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

公平警告:我自己实际上并没有这样做,而且这些都没有经过个人测试。您可能想要查看文档(L4.1 文档L4.2 文档)并查看 Laravel 代码。

其他注意事项:

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