Laravel5 - 使用数据库驱动程序更改主键列的名称

时间:2017-10-07 22:14:49

标签: php laravel laravel-5

使用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

1 个答案:

答案 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