2017-07-18 30 views
0

我對Laravel,Eloquent和Artisan還是比較陌生的。 我想要做的事情很簡單:我想創建一個新的Eloquent模型關於我們,以及一個遷移文件來創建表about_us。Laravel:重命名數據庫表格中斷功能

我運行下面的命令:

PHP artisan make:model AboutUs -m 

這產生了模型和遷移文件,但是,遷移文件被命名爲「2017_07_18_211959_create_about_uses_table.php」,自動添加不必要的「ES」到「我們」,並創建一個'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'); 

這將重命名錶中的DB,但不是在自動加載文件或任何其他地方,造成斷功能。

當然必須有一個更簡單的方法之一:

  • 創建一個與固定名稱遷移文件的模型,而不是它 自動通過添加不必要的後綴更改名稱。
  • 重命名模型並更改必要的文件以防止模型 中斷。

在我對此失去理智之前,有誰能指出我正確的方向嗎? :)

+0

你有沒有嘗試在相關模型中使用正確的表名?如果你仍然在開發數據庫中,我會簡單地刪除包括遷移表在內的所有表,建立正確的遷移文件。然後重新運行遷移,就像它第一次一樣 –

+0

這是因爲默認情況下,雄辯是遵循表名的多個模型名稱。檢查@pehbehbeh ansewer。 – Tpojka

+0

我儘可能多地假設,但不知道如何覆蓋它並選擇一個固定的名稱。謝謝! – Jort

回答

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

希望有所幫助。

+1

不錯,我不知道這個。我稍後回家時會嘗試,但我相信這會起作用。非常感謝你! – Jort

+0

它有什麼缺點重新命名數據庫?可能有些雄辯的東西不能在以後工作? – Adam