Laravel 修改 Auth::user() 查询?
Laravel modify Auth::user() query?
我想在我的 Auth::user() 查询中添加一些联接。如何在不创建全新查询的情况下执行此操作?我只是希望能够使 Auth::user() 的默认调用不同于:
SELECT * FROM `users` WHERE `id` = ?
到
SELECT * FROM users INNER JOIN user_icons ON user_icons.ID = users.iconid WHERE `id` = ?
我使用的是默认模型用户 class。
如果你有 1:n 关系:
使用外键 "user_id".
向您的数据库添加 "icons" table
为您的模型添加 "Icon" 个模型。
<?php
class Icon extends Eloquent{
...
}
?>
在模型Class中"User"添加一个函数:
public function icons() {
return $this->hasMany('Icon');
}
现在您可以这样做了:
$userIcons = Auth::user()->icons();
Laravel 为您提供了一种扩展 Auth
功能的方法。首先,您需要创建一个实现 Illuminate\Auth\UserProviderInterface
的 class。获得 class 后,您可以调用 Auth::extend()
使用新的 class.
配置 Auth
对于您的情况,最简单的方法是创建一个扩展 Illuminate\Auth\EloquentUserProvider
的 class。您需要更新 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
}
}
一旦你的 class 充实了,你需要告诉 Auth 使用它:
Auth::extend('eloquent', function($app) {
return new MyEloquentUserProvider($app['hash'], $app['config']['auth.model']);
});
Auth::extend
方法的第一个参数是 app/config/auth.php
中定义的正在使用的 auth 驱动程序的名称。如果需要,您可以创建一个新驱动程序(例如 'myeloquent'),但您需要更新 Auth::extend
语句和 app/config/auth.php
驱动程序。
完成所有这些后,Auth::user()
将最终调用您的 MyEloquentUserProvider::retrieveById
方法。
中肯警告:我自己并没有真正做到这一点,none 这是我亲自测试过的。您可能需要查看文档 (L4.1 docs, L4.2 docs) 并查看 Laravel 代码。
其他说明:
- 人们已经表示这可能不是您想要做的。但是,此信息可能对您和出于其他原因希望扩展 Auth 的其他人有所帮助。
- 考虑到您的内部联接,如果用户没有关联的 user_icons 记录,
Auth::user()
将不再有 return 记录,并且该用户可能无法完全登录。
我想在我的 Auth::user() 查询中添加一些联接。如何在不创建全新查询的情况下执行此操作?我只是希望能够使 Auth::user() 的默认调用不同于:
SELECT * FROM `users` WHERE `id` = ?
到
SELECT * FROM users INNER JOIN user_icons ON user_icons.ID = users.iconid WHERE `id` = ?
我使用的是默认模型用户 class。
如果你有 1:n 关系:
使用外键 "user_id".
向您的数据库添加 "icons" table为您的模型添加 "Icon" 个模型。
<?php
class Icon extends Eloquent{
...
}
?>
在模型Class中"User"添加一个函数:
public function icons() {
return $this->hasMany('Icon');
}
现在您可以这样做了:
$userIcons = Auth::user()->icons();
Laravel 为您提供了一种扩展 Auth
功能的方法。首先,您需要创建一个实现 Illuminate\Auth\UserProviderInterface
的 class。获得 class 后,您可以调用 Auth::extend()
使用新的 class.
Auth
对于您的情况,最简单的方法是创建一个扩展 Illuminate\Auth\EloquentUserProvider
的 class。您需要更新 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
}
}
一旦你的 class 充实了,你需要告诉 Auth 使用它:
Auth::extend('eloquent', function($app) {
return new MyEloquentUserProvider($app['hash'], $app['config']['auth.model']);
});
Auth::extend
方法的第一个参数是 app/config/auth.php
中定义的正在使用的 auth 驱动程序的名称。如果需要,您可以创建一个新驱动程序(例如 'myeloquent'),但您需要更新 Auth::extend
语句和 app/config/auth.php
驱动程序。
完成所有这些后,Auth::user()
将最终调用您的 MyEloquentUserProvider::retrieveById
方法。
中肯警告:我自己并没有真正做到这一点,none 这是我亲自测试过的。您可能需要查看文档 (L4.1 docs, L4.2 docs) 并查看 Laravel 代码。
其他说明:
- 人们已经表示这可能不是您想要做的。但是,此信息可能对您和出于其他原因希望扩展 Auth 的其他人有所帮助。
- 考虑到您的内部联接,如果用户没有关联的 user_icons 记录,
Auth::user()
将不再有 return 记录,并且该用户可能无法完全登录。