Php Laravel modify Auth::user()查询?
我想在Auth::user()查询中添加一些连接。如何在不创建全新查询的情况下执行此操作?我只希望能够使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{ ... } ?> 现在您可以执
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']);
});