我想在我的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类。
答案 0 :(得分:4)
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
中定义的auth驱动程序的名称。如果需要,您可以创建新的驱动程序(例如' myeloquent'),但您需要更新Auth::extend
声明和app/config/auth.php
驱动程序。
完成所有这些操作后,Auth::user()
将最终调用您的MyEloquentUserProvider::retrieveById
方法。
公平警告:我自己并没有真正做到这一点,而且这些都没有经过个人测试。您可能希望查看文档(L4.1 docs,L4.2 docs)并查看Laravel代码。
其他说明:
Auth::user()
将不再返回记录,并且用户可能根本无法登录。答案 1 :(得分:1)
如果您有1:n关系:
添加"图标"使用外键" user_id"。
将数据库写入数据库添加"图标"为您的模型建模。
<?php
class Icon extends Eloquent{
...
}
?>
在模特班&#34;用户&#34;添加功能:
public function icons() {
return $this->hasMany('Icon');
}
现在你可以这样做:
$userIcons = Auth::user()->icons();