【发布时间】:2017-03-22 14:03:26
【问题描述】:
在 laravel 中,如果我想插入所有表单输入并且我想在其中一列中添加文本,为什么我不能使用此代码?
例子
$B2 = new B2;
$B2::create([
request()->all(),
$B2->column9 = "aaaa",
]);
插入的数据库只插入column9,其他column为Null。
【问题讨论】:
标签: laravel
在 laravel 中,如果我想插入所有表单输入并且我想在其中一列中添加文本,为什么我不能使用此代码?
例子
$B2 = new B2;
$B2::create([
request()->all(),
$B2->column9 = "aaaa",
]);
插入的数据库只插入column9,其他column为Null。
【问题讨论】:
标签: laravel
因为create() 接受一个数组作为唯一参数:
public static function create(array $attributes = [])
你可以这样做:
$data = request()->all();
$data['column9'] = 'aaaa';
B2::create($data);
【讨论】:
当您使用 request all 时,您必须首先确保您的模型中有可填充字段或将 = 保护为空数组,例如:
class B2 extends Model
{
protected $table = 'db_table';
protected $fillable = [
'email',
'name',
];
}
或者你可以使用
protected $guarded = [];
// 使用 Guarded 作为可填充的 Pose 时请小心,因为它会给您带来安全问题,并且应该只在测试环境中真正使用,除非您真的知道自己在做什么!
至于你的创建方法,你应该确保它是一个像这样的关联数组:
$B2::create([
$B2->column9 => "aaaa",
]);
或者你可以这样做:
$data = $request->except('_token');
$B2::create($data);
【讨论】:
你必须合并数组。
$B2::create(array_merge(request()->all(), ['column9' => 'text']));
【讨论】:
当您添加到数据库中时,它被称为批量分配。 Laravel 会自动防止这种情况发生,因此您需要将名称添加到模型中的可填充属性中
protected $fillable = ['field1', 'column9'] //etc
https://laravel.com/docs/5.4/eloquent#mass-assignment
您还需要确保将数组传递给 create 方法
$my_array = $request->all()
$my_array['column9'] = 'aaaa';
$B2::create(
$my_array
);
【讨论】: