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:重命名数据库表中断功能的主要内容,如果未能解决你的问题,请参考以下文章