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

时间:2017-07-18 21:44:01

标签: laravel model eloquent migration artisan

我对Laravel,Eloquent和Artisan来说还是一个新手。 我想要做的事情很简单:我想创建一个新的Eloquent模型AboutUs,以及一个用于创建about_us表的迁移文件。

我运行以下命令:

PHP artisan make:model AboutUs -m

这将生成模型和迁移文件,但是,迁移文件名为' 2017_07_18_211959_create_about_uses_table.php',自动添加不必要的'到我们这里,然后创建一个表格' 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

数据库表&#39; about_us&#39;是正确创建的,但是当我在表中插入一行并尝试使用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

我可以看到仍有人参考&#34; aboutuses&#34;在autoload_classmap和autoload_static文件中。手动更改此问题并不能解决问题,也无法运行:

composer dump autoload

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

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

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

当然,必须有一种更简单的方法:

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

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

1 个答案:

答案 0 :(得分:3)

您可以在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

希望有所帮助。