【发布时间】: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答案。
-
我假设了很多,但不知道如何覆盖它并选择一个固定的名称。谢谢!
标签: laravel model eloquent migration laravel-artisan