Laravel修改Auth :: user()查询?

时间:2015-01-13 16:12:31

标签: php mysql join laravel

我想在我的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类。

2 个答案:

答案 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 docsL4.2 docs)并查看Laravel代码。

其他说明:

  • 人们已经说过,这可能不是你想要做的。但是,此信息可能对您和其他希望通过其他原因扩展Auth的人有所帮助。
  • 考虑到您的内部联接,如果用户没有关联的user_icons记录,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();