2014-09-21 25 views
0

我已經開始使用Laravel 4,並且被一個奇怪的問題困住了。我爲表格寫了我的遷移,它成功地創建了表格。爲什麼我的Laravel 4的種子腳本生成不正確的插入查詢?

<?php  
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class CreateOrgRoles extends Migration { 
    protected $tableName ; 

function __construct(){ 
    $this->tableName = "org_roles"; 
} 
    public function up() 
    { 
     Schema::dropIfExists($this->tableName); 
     Schema::create($this->tableName, function(Blueprint $table) 
     { 
      $table->increments('id'); 
      $table->string('role_name')->unique(); 
      $table->mediumText('role_description')->nullable(); 
      $table->timestamps(); 
     }); 
    } 

    public function down(){ 
     Schema::drop($this->tableName); 
    } 
} 

然後我繼續寫表的一個簡單的模型作爲OrgRole.php

<?php 

class OrgRole extends Eloquent { 
    protected $tableName; 
    protected $fillable = ['role_name', 'role_description']; 

    function __construct(){ 
    $this->tableName = 'org_roles'; 
    } 
} 

然後我寫的種子文件,如下

<?php 

class OrgRolesTableSeeder extends Seeder { 

    protected $tableName; 

    function __construct(){ 
    $this->tableName = "org_roles"; 
    } 

    public function run() { 
    $defaultRoles = array(
     [ 
     'role_name'   => 'guest', 
     'role_description'  => 'the most basic one of all' 
     ] 
    ); 

    foreach ($defaultRoles as $role) { 
     OrgRole::create($role); 
    } 
    } 

} 

現在,當我運行seed命令,形成的插入查詢是錯誤的,並且播種失敗

» php artisan db:seed                       
    [Illuminate\Database\QueryException]                  
    SQLSTATE[HY000]: General error: 1364 Field 'role_name' doesn't have a default value (SQL: insert into `or 
    g_roles` (`updated_at`, `created_at`) values (2014-09-21 01:57:14, 2014-09-21 01:57:14))     

    [PDOException]                  
    SQLSTATE[HY000]: General error: 1364 Field 'role_name' doesn't have a default value 

有人能幫助我理解我做錯了什麼嗎?

回答

0
  1. 從您的播種機和模型文件中移除構造函數。在播種機中沒有必要,因爲您在run()方法中調用了模型OrgRole

  2. 在模型文件中,將protected $tableName;替換爲 protected $table = 'org_roles';

然後再次嘗試運行php artisan db:seed。 (請確保刪除已經播種的記錄,否則role_name上的獨特要求將導致播種失敗。)

+0

that worked ..所以我使用構造函數來設置常量類的表名。爲什麼構造函數會干擾這種情況? – jagzviruz 2014-09-21 03:28:19

+0

因爲'OrgRole'中的構造函數,擴展了Eloquent類,重寫了Eloquent的(父類)構造函數。如果你在'OrgRole'中包含一個構造函數,不管構造函數是什麼,你需要包含'parent :: __ construct',這樣'Eloquent'構造函數也會被調用。另外請注意,正確的變量是'$ table',而不是'$ tableName'。 – damiani 2014-09-21 03:37:07

+0

另一個好處是:在你的OrgRole模型類中,你甚至不需要包含顯式的'$ table'聲明,因爲你已經命名了你的db文件'org_roles'。假設[a]表名是模型名的複數形式,並且[b]模型名中的大寫字母與表名中的下劃線相對應,Laravel將自動從模型名稱中找出表名。 – damiani 2014-09-21 03:46:13

相關問題