主页/PHP笔记/PHP问答/框架Laravel/如何在 Laravel 的 Eloquent 中使用自定义表名

如何在 Laravel 的 Eloquent 中使用自定义表名

Bug编译狮

Bug编译狮

在 Laravel 中,如果你希望使用自定义的表名,可以通过配置文件来实现。以下是具体步骤:

  1. 编辑 config/database.php 文件: 打开 config/database.php 文件,找到 connections 部分,然后找到你要修改的数据库连接(例如 mysqlpgsql)。

  2. 添加或修改 table 字段: 在每个数据库连接中,添加或修改 table 字段,将其值设置为你想要使用的表名。

    'mysql' => [
       'driver' => 'mysql',
       'host' => env('DB_HOST', '127.0.0.1'),
       'port' => env('DB_PORT', 3306),
       'database' => env('DB_DATABASE', 'forge'),
       'username' => env('DB_USERNAME', 'forge'),
       'password' => env('DB_PASSWORD', ''),
       'charset' => 'utf8mb4',
       'collation' => 'utf8mb4_unicode_ci',
       'prefix' => '',
       'strict' => false,
       'engine' => null,
       // 添加或修改 table 字段
       'table' => 'custom_table_name',
    ],
  3. 应用迁移: 修改完 config/database.php 文件后,运行迁移命令以应用更改。

    php artisan migrate

    这将根据你的配置创建一个新的表,并且这个新表的名字将是你指定的表名。

示例代码

以下是一个完整的示例,展示了如何在 config/database.php 文件中添加自定义表名,并在模型中使用它:

config/database.php

'default' => env('DB_CONNECTION', 'mysql'),

'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', 3306),
        'database' => env('DB_DATABASE', 'forge'),
        'username' => env('DB_USERNAME', 'forge'),
        'password' => env('DB_PASSWORD', ''),
        'charset' => 'utf8mb4',
        'collation' => 'utf8mb4_unicode_ci',
        'prefix' => '',
        'strict' => false,
        'engine' => null,
        'table' => 'custom_table_name',
    ],
],

AppModelsYourModel.php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class YourModel extends Model
{
    protected $table = 'custom_table_name';
}

通过以上步骤,你可以轻松地在 Laravel 中使用自定义的表名。

黑板Bug讲师

黑板Bug讲师

介绍

Eloquent ORM(对象关系映射器)是Laravel中的一个关键特性,它通过实现活动记录模式来简化与数据库的交互。根据惯例,Eloquent会根据类名的小写形式生成表名,并将其转换为单数形式。然而,这种做法可能不适用于所有人,尤其是在处理遗留数据库或应用程序时,如果表命名约定不同。Eloquent的一个最灵活的功能就是允许你在模型中自定义表名。在本教程中,我们将一步步指导您使用自定义表名的过程,涵盖从基础到更高级别场景的所有内容。

基本用法

定义Eloquent中的表名的最简单方法是通过明确指定一个受保护的属性来实现。$table在你的模型内部,可以这样定义:

class User extends Model {
    protected $table = 'my_custom_users';
}

由于这一更改,Eloquent在查询User模型时会使用‘my_custom_users’而不是默认的‘users’表。

高级表名定义

在指定自定义名称时,确实非常简单和直观,但在某些情况下,应用程序可能需要在运行时确定表名。你可以重写这个方法来实现这一点。getTable在您的模型内部实现这一点的方法是什么:

class User extends Model {
    public function getTable() {
        return 'prefix_' . parent::getTable();
    }
}

该代码动态设置表名,通过前缀来实现,这在多租户系统中非常有用,每个租户都有自己的表前缀。

与Schema Builder合作

在创建迁移时,你应该确保在schema操作中使用正确的表名:

Schema::create('my_custom_users', function (Blueprint $table) {
    // Define the schema for the my_custom_users table
});

记得在迁移时,将表名与模型中定义的名称保持一致。

与定制表名的关系

在定义关系时,自定义表名也需要特别注意。你需要在关系方法中指定自定义表名。

class Post extends Model {
    public function author() {
        return $this->belongsTo(User::class, 'author_id', 'id');
    }
}

默认情况下,的belongsTo方法尝试链接到‘用户’表。由于Eloquent根据User模型配置自动处理了这一点,因此无需进行额外更改即可与‘我的自定义用户’表无缝集成。

查询使用自定义表名

当查询具有自定义表名的模型时,不需要直接指定表名。像以下这样的查询可以直接使用:

$users = User::where('active', 1)->get();

这个查询语句将会正确地与 ‘my_custom_users’ 表进行匹配。

结论。

本教程探讨了在Laravel的Eloquent ORM中使用自定义表名的各种方法。您学习了如何显式定义自定义表名、动态设置表名以及在定义关系和编写迁移文件时如何处理自定义表名。遵循这些指导原则,您可以灵活地与任何数据库模式工作,同时利用Eloquent的强大功能。

当你开始处理Laravel项目时,要记住:惯例是工具,而不是规则。Eloquent与自定义表名的适应性正是Laravel设计为开发者而设的一个绝佳例子,它既强大又灵活。

长工码奴1523

长工码奴1523

在 Laravel 5.7 及更高版本中,你可以通过以下方式在 Eloquent 模型中使用自定义表名:

  1. 首先确保你在数据库配置文件(database.php)中启用了 --table-prefix 参数:

    $connect->useDatabaseForMigration();
    $connect->setAsGlobalConnection('default');
  2. 创建一个新的迁移来修改数据库的表结构:

    php artisan make:migration add_custom_column_to_table_name migration_name
  3. 在迁移脚本中添加自定义字段,并设置相应的字段类型和数据类型:

    $table->string('custom_column', 100)->nullable()->after('column');
  4. 使用这个迁移来创建新表并应用自定义字段:

    php artisan migrate --seed
  5. 现在,当你运行查询时,Laravel 将会自动将自定义字段的值与表名关联起来。

  6. 示例代码(假设表名为 my_table,自定义字段名为 custom_column):

class MyModel extends Model
{
    use SoftDeletes;

    protected $table = 'my_table';
    protected $primaryKey = 'id';

    public function getCustomColumnAttribute()
    {
        return $this->getAttribute('custom_column');
    }
}

在这个例子中,当从数据库查询 MyModel 对象中的 custom_column 字段时,Laravel 会自动根据 my_table 表名将其与 custom_column 关联起来。

如果你需要更复杂的表名处理逻辑,例如根据特定的规则生成表名,可以考虑使用 Laravel 的 config 文件系统,或者编写自定义的迁移和模型类。