Laravel:重命名数据库 table 破坏了功能

Laravel: renaming database table breaks functionality

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

我运行以下命令:

PHP artisan make:model AboutUs -m

这会生成模型和迁移文件,但是,迁移文件名为“2017_07_18_211959_create_about_uses_table.php”,自动将不需要的 'es' 添加到 'us',并创建一个 table '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

数据库 table 'about_us' 已正确创建,但是当我在 table 中插入一行并尝试使用 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" 的引用。手动更改此设置不能解决问题,运行ning:

也不能
composer dump autoload

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

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

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

肯定有更简单的方法:

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

您可以在 Eloquent 模型 class 中指定自定义 table 名称。这是文档中的示例:

<?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

希望对您有所帮助。