2017-06-20 48 views
0

我正在使用firsOrCreate方法來保存記錄,如果它們已經不存在於數據庫中。這是我的函數:Laravel - firstOrCreate沒有堅持所有字段到數據庫

return ContentType::firstOrCreate(
    ['name' => $type], ['slug' => str_slug($type, '-')] 
); 

我這裏的問題是,新的記錄在數據庫中創建,但塞領域保持爲空。不知道這是爲什麼,因爲塞被創建,因爲當我做

dd(str_slug($type, '-')); 

方法firstOrCreate()之前,我得到了塞。 那麼,爲什麼它沒有堅持到數據庫?

我已經在我的模型建立保護森嚴陣列所以,這不應該成爲問題:

protected $guarded = [ 
     'id' 
    ]; 
+0

應該不是所有的領域是在單個陣列中,即'[」 name'=> $ type,'slug'=> str_slug($ type,' - ')]'? – apokryfos

回答

0

您需要確保蛞蝓和name屬性是可填寫。

如果ContentType模型,確保可填充的屬性看起來像:

class ContentType 
{ 
    protected $fillable = ['name', 'slug']; 
} 
+0

但是,這就是https://laravel.com/docs/5.4/eloquent文檔中的那種方式,您需要爲要搜索表的列以及要保留的字段數組使用單獨的數組模型在DB中不存在 – Leff

+0

你是對的,我已經更新了我的答案 - 我沒有正確地閱讀這個問題。 – LMS94

+1

其實,你的第一個答案是正確的,我正在使用遺留代碼,並沒有檢查版本,因爲事實證明,我有v5.2,firstOrCreate只需要一個數組。 – Leff

0

是您slug場在$fillable屬性模型中的陣列?否則它不會被插入,由於它被保護:

use Illuminate\Database\Eloquent\Model; 

class ContentType extends Model 
{ 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 
     'slug', 
    ]; 
} 

對於別人看,Laravel 5.3/5.4支持本次陣列:

https://github.com/laravel/framework/blob/5.4/src/Illuminate/Database/Eloquent/Builder.php#L349-L365

https://github.com/laravel/framework/blob/5.3/src/Illuminate/Database/Eloquent/Builder.php#L251-L271

然而Laravel 5.2及以下版本不:

https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/Eloquent/Builder.php#L243-L260

在模型中
0

第一設置$可填寫如下:

/** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'name', 
     'slug', 
    ]; 

請嘗試以下方法插入

$data = array(
    'name' => $type, 
    'slug' => str_slug($type, '-') 
    ); 

return ContentType::firstOrCreate($data);