Laravel:重命名数据库表中断功能

Posted

技术标签:

【中文标题】Laravel:重命名数据库表中断功能【英文标题】:Laravel: renaming database table breaks functionality 【发布时间】:2017-12-23 23:04:09 【问题描述】:

我对 Laravel、Eloquent 和 Artisan 还是很陌生。 我要做的很简单:我想创建一个新的 Eloquent 模型 AboutUs,以及一个迁移文件来创建表 about_us。

我运行以下命令:

php artisan make:model AboutUs -m

这会生成模型和迁移文件,但是迁移文件名为“2017_07_18_211959_create_about_uses_table.php”,会自动将不必要的“es”添加到“us”,并创建一个表“aboutuses”而不是“about_us”。 如果我像这样手动更改迁移文件:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAboutUsTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('about_us', function (Blueprint $table) 
            $table->increments('id');
            $table->timestamps();
            $table->boolean('active');
            $table->string('title')->nullable();
            $table->text('text')->nullable();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('about_us');
    

这样的模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class AboutUs extends Model

    protected $fillable = ['id', 'active', 'title', 'text'];

    public static function getAboutUs()
    
        return AboutUs::find(1);
    

    public function postAboutUs($session, $active, $title, $text)
    
        $aboutUs = $session->get('about_us');
        array_push($aboutUs, ['active' => $active, 'title' => $title, 'text' => $text,]);
        $session->put('about_us', $aboutUs);
    

然后运行迁移:

PHP artisan migrate

数据库表 'about_us' 已正确创建,但是当我在表中插入一行并尝试使用 getAboutUs 时,它崩溃了,laravel.log 指出:

local.ERROR: exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'ID226233_db.aboutuses' doesn't exist' in C:\PHP Projects\xxx\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\PDOConnection.php:77

我可以看到在 autoload_classmap 和 autoload_static 文件中仍然有对“aboutuses”的引用。手动更改并不能解决问题,运行也不能:

composer dump autoload

接下来,我尝试简单地不重命名表,而是运行迁移以创建初始的“aboutuses”表。这修复了功能,因为模型现在可以正常工作。但是,如果我现在添加一个新的迁移:

Schema::rename('aboutuses', 'about_us');

这会重命名数据库中的表,但不会在自动加载文件或其他任何地方重命名,从而导致功能损坏。

肯定有更简单的方法:

使用带有 FIXED 名称的迁移文件创建模型,而不是它 通过添加不必要的后缀自动更改名称。 重命名模型并更改必要的文件以防止模型 从打破。

在我对此失去理智之前,谁能指出我正确的方向? :)

【问题讨论】:

您是否尝试过在相关模型中使用正确的表名?如果您仍在开发数据库中,我会简单地删除所有表,包括迁移表,制作正确的迁移文件。然后像第一次一样重新运行迁移 这是因为 eloquent 默认情况下,表名是模型名的复数形式。检查@pehbehbeh答案。 我假设了很多,但不知道如何覆盖它并选择一个固定的名称。谢谢! 【参考方案1】:

你可以在你的 Eloquent 模型类中指定一个自定义的表名。以下是文档中的示例:

<?php namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'my_flights';

来源: https://laravel.com/docs/5.4/eloquent#eloquent-model-conventions

希望对您有所帮助。

【讨论】:

很好,我不知道这个。我稍后回家时会尝试,但我相信这会奏效。非常感谢! 重命名数据库有什么缺点吗?以后会不会 eloquent 中的某些东西不起作用?

以上是关于Laravel:重命名数据库表中断功能的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 序列化:如何重命名属性?

Excle数据透视表如何重命名数据透视表

重命名多个表

重命名多个表

使用复制表重命名数据库

数据透视表列重命名