Laravel - firstOrCreate不会将所有字段都保存到DB

时间:2017-06-20 14:00:09

标签: php laravel

我正在使用firsOrCreate方法来保存记录,如果它们在DB中已经不存在的话。这是我的功能:

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

我遇到的问题是新记录是在DB中创建的,但是slug字段保持为空。不知道为什么是因为slug被创建了,因为当我做

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

在方法firstOrCreate()之前,我确实得到了slu .. 那么,为什么不坚持DB?

我已经在我的模型中设置了保护防护阵列,所以这不应该是问题:

    protected $guarded = [
        'id'
    ];

3 个答案:

答案 0 :(得分:1)

您需要确保slug和name属性是可填充的。

如果是ContentType模型,请确保可填写属性如下:

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

答案 1 :(得分: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

答案 2 :(得分:0)

首先在模型中设置$ fillable,如下所示:

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

然后尝试以下方式插入

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

 return ContentType::firstOrCreate($data);