【问题标题】:How to migrate old MySQL database into Laravel Project?如何将旧的 MySQL 数据库迁移到 Laravel 项目中?
【发布时间】:2019-07-19 06:22:15
【问题描述】:

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

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

【问题讨论】:

  • 为什么不写迁移脚本呢?例如,您可以在迁移脚本中将 users.USER 迁移到 users.user 列。
  • 您也可以使用自定义模型进行身份验证,即users以外的表。有关详细信息,请参阅this 帖子。
  • 如果您当前的表架构具有主要列,即名称、密码、电子邮件;然后在 Users 表中,你可以通过传递表名来指定表属性,laravel 会自动选择它
  • @john 我的目标是强制 Laravel Auth 使用我的 users.USER 列,而不是检查 users.user 表。我不想更改我的表架构。

标签: php mysql laravel


【解决方案1】:

数据库注意事项

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

更多信息在这里Defining Models

使用自定义用户和传递字段进行身份验证

如果您运行了命令php artisan make: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你要找到providers数组,把模型属性值改成你的模型类名,例如:

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

为下一步做好准备。

第三: 现在您必须找到默认 Laravel Auth 的控制器,位于 app > http > controllers > auth > LoginController.php 中,然后在类中添加一个名为 username 的函数,该函数返回用于身份验证操作的用户名,如下所示:

class LoginController extends Controller{

    ..... // don't change other functions

    public function username(){ // add the function username
        return 'YourUsernameField';
    }

}

Blade登录模板注意:在你的登录blade模板中,用户名输入名称要改成新的,密码字段名称必须还是password,因为laravel使用了用于验证,但在内部它将使用您的自定义密码字段名称。

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

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

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

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

【讨论】:

  • 我个人认为这对他想要达到的目标来说太过分了。但这是一个结构良好且详细的答案。它也更多地回答了如何正确扩展的问题。
【解决方案2】:

数据库相关问题/答案:

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

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的官方文档。

如果您将以下 sn-p 放在您的 Controller 中:

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);

我在这里列出的所有内容都在上面的链接中,关于验证用户。

【讨论】:

    【解决方案3】:

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

    例如。

    <?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model{
        protected $table = 'users.USER';
    }
    
    

    【讨论】:

      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2020-01-22
      • 2018-07-19
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多