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()->icons()
不会返回任何图标,而是返回查询。
虽然这不会创建连接,但它会运行两个单独的查询。我试图避免尽可能多的查询调用。以上是关于Laravel 修改 Auth::user() 查询?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 使用 Auth::user() 设置模型连接
Laravel 5.4 Auth::User() 与关系不起作用
Laravel - 如何在不同域之间使用 Auth::check 或 Auth::user?
Laravel 5.2 错误 App\User 无法使用 Illuminate\Foundation\Auth\User - 这不是特征