Php Laravel modify Auth::user()查询?

Php Laravel modify Auth::user()查询?,php,mysql,join,laravel,Php,Mysql,Join,Laravel,我想在Auth::user()查询中添加一些连接。如何在不创建全新查询的情况下执行此操作?我只希望能够使Auth::user()的默认调用不同于: SELECT * FROM `users` WHERE `id` = ? 到 我使用的是默认的模型用户类 如果您有1:n关系: 使用外键“user\u id”将“icons”表添加到数据库中 将“图标”模型添加到模型中 <?php class Icon extends Eloquent{ ... } ?> 现在您可以执

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

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


我使用的是默认的模型用户类

如果您有1:n关系:

使用外键“user\u id”将“icons”表添加到数据库中

将“图标”模型添加到模型中

<?php

class Icon extends Eloquent{

  ...

}
?>
现在您可以执行以下操作:

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

Laravel为您提供了一种扩展
Auth
功能的方法。首先,您需要创建一个类来实现
illighted\Auth\UserProviderInterface
。拥有类后,可以调用
Auth::extend()
来配置新类的
Auth

对于您的情况,最简单的方法是创建一个扩展
illighted\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
中定义的正在使用的身份验证驱动程序的名称。如果需要,可以创建一个新的驱动程序(例如“mylequent”),但需要更新
Auth::extend
语句和
app/config/Auth.php
驱动程序

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

公正的警告:实际上我自己并没有这样做,所有这些都没有经过个人测试。您可能想查看文档(,)并查看Laravel代码

其他说明:

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

请记住,
Auth::user()->icons()
不会返回任何图标,但会返回查询。但这不会创建连接,它会运行两个单独的查询。我正在尽量避免查询调用。为什么?如果您正确描述了您的关系,获取图标将很容易。这应该通过用户模型上的关系来处理。我想减少我调用的查询数量。当使用关系时,它会创建额外的查询,我可以将这些查询加入到Auth::user()查询中。但这不会创建一个连接,它会运行两个单独的查询。我正在尽量避免查询调用。一般来说,用Laravel的方式做事情会更好。您的服务器不会在额外的查询中闪烁,代码复杂性的降低是值得的。谢谢您,这非常有帮助@RiKo通常在服务提供商的
boot()
方法中。@patricus感谢您的回复。我提出了一个关于拉威尔的问题。请查查,我想你能帮我。
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::extend('eloquent', function($app) {
    return new MyEloquentUserProvider($app['hash'], $app['config']['auth.model']);
});