我不使用Eloquent 。
我的用户表使用userid
作为主要列名(不是id
),我有实现Authenticatable接口的UserItem,我的config / auth.php如下所示:
'providers' => [
'users' => [
'driver' => 'database',
'table' => 'user',
],
],
当我将列重命名为'id'时,一切正常,但如果不这样做,我会收到此错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: select * from `user` where `id` = 55 limit 1)...
因为我的视图中的代码(默认情况下,只检查是否显示登录/注册或登录的用户菜单):
<?php if(auth()->guard()->guest()): ?>
这是这个指令:
@guest
我可以在哪里更改它,以便它不会找id
而是找userid
?
答案 0 :(得分:1)
使用'driver' => 'database'
,您不像'driver' => 'eloquent'
那样灵活
我可以告诉你,id
被硬编码为数据库驱动程序和GenericUser类的一部分。
如果您确实在寻找数据库驱动程序执行用户身份验证的位置,那么您需要查看:
/vendor/laravel/framework/src/Illuminate/Auth/DatabaseUserProvider.php
public function retrieveById($identifier)
{
$user = $this->conn->table($this->table)->find($identifier);
return $this->getGenericUser($user);
}
这里我们连接数据库并通过它的标识符检索用户。到目前为止一直很好,但这是调用find
方法,你会在这里找到:
/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php
public function find($id, $columns = ['*'])
{
return $this->where('id', '=', $id)->first($columns);
}
您会发现id
是数据库驱动程序使用的任何简单查找方法的固定字符串。将其更改为userid
将导致您必须访问数据库中的所有主键,当然还有使用id
的所有其他方法。
GenericUser
还有id
作为识别用户的硬编码值,请参阅:
/vendor/laravel/framework/src/Illuminate/Auth/GenericUser.php
public function getAuthIdentifierName()
{
return 'id';
}
因此,即使您将所有id
更改为userid
也不能更新,因为所有内容都将被覆盖。
我的建议:如果可以,请使用Laravel Eloquent,或将主要标识符保留为id
。
仅供参考:我使用的是Laravel 5.5 Codebase