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

Posted

技术标签:

【中文标题】Laravel 修改 Auth::user() 查询?【英文标题】:Laravel modify Auth::user() query? 【发布时间】:2015-03-11 15:59:33 【问题描述】:

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

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

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

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

【问题讨论】:

有什么用?如果您正确描述您的关系,则获得图标将很容易。 这应该通过用户模型上的关系来处理。 我想减少我调用的查询数量。使用关系时,它会创建额外的查询,否则我可以加入 Auth::user() 查询。 虽然这不会创建连接,但它会运行两个单独的查询。我试图避免尽可能多的查询调用 一般来说,你最好以 Laravel 的方式做事。您的服务器不会因额外的查询而闪烁,并且降低代码的复杂性是值得的。 【参考方案1】:

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
    

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

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

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

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

公平警告:我自己并没有真正做到这一点,而且这些都没有经过个人测试。您可能需要查看文档(L4.1 docs、L4.2 docs)并查看 Laravel 代码。

其他说明:

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

【讨论】:

感谢您,这对您有很大帮助! @RiKo 一般在服务提供者的boot() 方法中。 @patricus 感谢您的回复。我提出了关于 laravel 的问题。请检查,我想你可以帮助我。 ***.com/questions/33616869/…【参考方案2】:

如果你有 1:n 关系:

使用外键“user_id”向您的数据库添加一个“图标”表。

为您的模型添加一个“图标”模型。

<?php

class Icon extends Eloquent

  ...


?>

在模型类“用户”中添加一个函数:

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

现在你可以这样做了:

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

【讨论】:

请记住,Auth::user()-&gt;icons() 不会返回任何图标,而是返回查询。 虽然这不会创建连接,但它会运行两个单独的查询。我试图避免尽可能多的查询调用。

以上是关于Laravel 修改 Auth::user() 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 使用 Auth::user() 设置模型连接

Laravel 5.4 Auth::User() 与关系不起作用

Laravel - 如何在不同域之间使用 Auth::check 或 Auth::user?

Laravel Auth::user() 关系

Laravel 5.2 错误 App\User 无法使用 Illuminate\Foundation\Auth\User - 这不是特征

每次我调用 Auth::user() 时,Laravel 都会查询数据库吗?