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
有人能幫助我理解我做錯了什麼嗎?
that worked ..所以我使用構造函數來設置常量類的表名。爲什麼構造函數會干擾這種情況? – jagzviruz 2014-09-21 03:28:19
因爲'OrgRole'中的構造函數,擴展了Eloquent類,重寫了Eloquent的(父類)構造函數。如果你在'OrgRole'中包含一個構造函數,不管構造函數是什麼,你需要包含'parent :: __ construct',這樣'Eloquent'構造函數也會被調用。另外請注意,正確的變量是'$ table',而不是'$ tableName'。 – damiani 2014-09-21 03:37:07
另一個好處是:在你的OrgRole模型類中,你甚至不需要包含顯式的'$ table'聲明,因爲你已經命名了你的db文件'org_roles'。假設[a]表名是模型名的複數形式,並且[b]模型名中的大寫字母與表名中的下劃線相對應,Laravel將自動從模型名稱中找出表名。 – damiani 2014-09-21 03:46:13