我正在使用firsOrCreate方法来保存记录,如果它们在DB中已经不存在的话。这是我的功能:
return ContentType::firstOrCreate(
['name' => $type], ['slug' => str_slug($type, '-')]
);
我遇到的问题是新记录是在DB中创建的,但是slug字段保持为空。不知道为什么是因为slug被创建了,因为当我做
时dd(str_slug($type, '-'));
在方法firstOrCreate()
之前,我确实得到了slu ..
那么,为什么不坚持DB?
我已经在我的模型中设置了保护防护阵列,所以这不应该是问题:
protected $guarded = [
'id'
];
答案 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);