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
希望对您有所帮助。
我对 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
希望对您有所帮助。