如何将旧的MySQL数据库迁移到Laravel Project?

时间:2019-02-25 19:08:36

标签: php mysql laravel

我正在尝试将旧的PHP / MySQL迁移到Laravel项目。由于许多原因,我不应该修改数据库表架构。我需要修改Laravel框架类。例如,我想强制Laravel Auth检查users.USER大写列以返回用户,而不是users.user。我需要知道Laravel框架的哪一部分检查users数据库表或user列。如何修改而不会破坏默认的Auth功能。

更具体地说:我想知道Laravel如何在/Vendor/laravel/framework/src/illuminate/Auth/EloquentUserProvider.php第137 validateCredentials()行中从数据库中检索数据。

3 个答案:

答案 0 :(得分:2)

您将必须为表和关系创建所有模型。在模型上,您可以指定表名,如果不想,则不必重命名表。

例如。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class User extends Model{
    protected $table = 'users.USER';
}

答案 1 :(得分:2)

数据库方面的考虑

如果要在laravel应用程序上使用自定义数据库,只需为数据库的每个表创建一个模型,然后设置表名,主键和可填充属性。

此处更多信息Defining Models

使用自定义用户和密码字段进行身份验证

如果运行命令php artisan make:auth,但要使用其他表或字段而不是默认用户,并且在不破坏创建的Auth功能的情况下进行传递,则必须使laravel知道,请按照下面列出的步骤进行操作:

首先:为要用于身份验证的表创建模型。为此,请运行命令php artisan make:model FooUserTable,其中'FooUser'是表的名称。

接下来,您必须在模型上设置表名,主键和可填写字段,例如以下行:

class FooUser extends Authenticatable{

    protected $table = 'FooUser';
    protected $primaryKey = 'foo_id_user'; // Place here the name of the id of your table
    protected $fillable = [ // Insert here all the fillable fields of your users table
        'field1',
        'field2',
        ...
    ];

}

请注意,模型现在从Authenticatable而不是模型扩展,这是类Illuminate\Foundation\Auth\User的别名。为了使其正常工作,只需将use Illuminate\Foundation\Auth\User as Authenticatable放在文件顶部。

这很重要!:

为了使用另一个字段名作为密码,请将函数getAuthPassword放入用户表的模型中,例如下面的行:

public function getAuthPassword(){
    return $this->myPasswordField; // myPasswordField is the field on your users table for password
}

现在您已经准备好所有模型,可以进行下一步了。

第二个::必须在文件config > auth.php上找到provider数组,并将model属性值更改为模型类名称,例如:

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\FooUser::class, // Place here the name of your model
    ],
],

一切准备就绪。

第三步:现在,您必须找到位于app > http > controllers > auth > LoginController.php和类中的默认Laravel Auth的控制器,只需添加一个名为{{1}的函数},返回用于auth操作的用户名,例如以下行:

username

刀片式登录模板注释::在登录刀片式模板中,您应该将用户名输入名称更改为新名称,并且密码字段名称仍必须为class LoginController extends Controller{ ..... // don't change other functions public function username(){ // add the function username return 'YourUsernameField'; } } ,这是因为laravel使用它进行验证,但是在内部它将使用您的自定义密码字段名称。

仅此而已。希望对您有帮助。

注意:切勿将文件编辑到供应商文件夹中!

有关更多信息,请阅读Manually Authenticating Users部分中的文档

所有这些都在Laravel 5.4和5.7版本上进行了测试。

答案 2 :(得分:1)

数据库相关问题/答案:

要从数据库方案中提取模型,可以使用以下软件包:

Reliese/Laravel

此软件包可以自动生成开始在Laravel中使用数据库所需的Eloquent模型。

它有一堆易于使用的命令,能够根据您的数据库方案创建模型。

用法

让我们从默认连接中搭建一些模型。

php artisan code:models

您可以像这样折叠特定的表格:

php artisan code:models --table=users

您还可以指定连接:

php artisan code:models --connection=mysql

如果使用的是MySQL数据库,则可以指定要支持的架构:

php artisan code:models --schema=shop

扩展/编辑身份验证功能

看看有关manually authenticating的官方文档。

如果在控制器中放置以下代码段:

public function authenticate(Request $request)
{
    $credentials = $request->only('email', 'password');

    if (Auth::attempt($credentials)) {
        // Authentication passed...
        return redirect()->intended('dashboard');
    }
}

如果需要指定要使用的属性,则可以使用以下内容:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
  // The user is active, not suspended, and exists.
}

您还可以自行检查,然后直接使用以下代码登录代码:

Auth::login($user);

// Login and "remember" the given user...
Auth::login($user, true);

我在此处列出的所有内容都在上面有关验证用户身份的链接中。