将元素数组存储到数据库(Laravel)
Posted
技术标签:
【中文标题】将元素数组存储到数据库(Laravel)【英文标题】:Store an array of elements to database (Laravel) 【发布时间】:2017-01-24 17:57:02 【问题描述】:我需要建议如何将数组存储到数据库。例如,我有一个带有name="user_phone[]"
的输入,我想将此输入的值存储到数据库中。
我有一个这样的表格,还有其他输入,但我只复制一个:
!! Form::open([route('some.router')]) !!
<fieldset class="form-group">
Form::label(null, 'Phone')
Form::text('user_phone[]', null, ['class' => 'form-control'] )
</fieldset>
!! Form::close() !!
和控制器:
public function postAddOrder(Request $request)
$this->validate($request, [
'receipt_date' => 'date|required',
'return_date' => 'date|required',
'user_name' => 'required',
'user_phone' => 'required',
'work_sum' => 'integer|required',
'user_descr' => 'required',
'foruser_descr' => 'required'
]);
$user = new User;
$user = $user->all()->find($request->input('user_name'));
$order = new Order([
'receipt_date' => $request->input('receipt_date'),
'return_date' => $request->input('return_date'),
'user_name' => $user->fio,
'user_phone' => $request->input('user_phone'),
'device' => $request->input('device'),
'work_sum' => $request->input('work_sum'),
'master_name' => $request->input('master_name'),
'user_descr' => $request->input('user_descr'),
'foruser_descr' => $request->input('foruser_descr'),
'type' => $request->input('type'),
'status' => $request->input('status'),
'engineer' => $request->input('engineer'),
'partner' => $request->input('partner'),
'office' => $request->input('office')
]);
$order->save();
return redirect()->route('admin.orders.index');
问题是当我提交表单并收到错误时:
htmlentities() expects parameter 1 to be string, array given
我还使用强制转换将数组存储到数据库:
/**
* The attributes that should be casted to native types.
*
* @var array
*/
protected $casts = [
'user_phone' => 'array',
];
值存储正确,主要问题是 validate() 方法没有捕捉到错误。例如,我没有在需要的输入中填写一些数据。当我得到错误而不是得到错误时,我得到了错误
htmlentities() expects parameter 1 to be string, array given
当我用数据填充所有输入时,一切正常。
【问题讨论】:
您可以使用php的implode
函数并将逗号分隔的值存储到数据库中..
【参考方案1】:
我认为问题出在你的规则
'user_phone' => 'required
要验证数组值,您应该使用数组验证。 (Link)
像这样重写你的规则
"user_phone.0" => "required"
这将确保至少提供一个 user_phone。
如果您想验证电话格式,请使用:
"user_phone.*" => "Insert validation here"
【讨论】:
Form::text('user_phone[]', null, ['class' => 'form-control'] )
这样的输入是真的吗??用这个括号来存储值数组?或者也许在 laravel 中还有另一种方式?
没问题。您是否确定错误是在验证时还是在订单创建期间出现的?
i.gyazo.com/d4a83e7d3b2f480339c97c0e0ca4bf90.png - 也许有帮助。我真的不知道。我认为错误出现在验证之前。因为我在提交表单后立即出错
另外我刚刚意识到你选择用户的部分应该是这样的:$user = User::find($request->input('user_name'));
我想知道保存部分是否真的很好(检查数据库中是否有新行),在渲染视图“admin.orders.index”时似乎发生了错误。检查您如何使用视图中的 user_phone 字段【参考方案2】:
找到定义。
!! Form::open([route('some.router')]) !!
<fieldset class="form-group">
Form::label(null, 'Phone')
Form::text('user_phone[0]', null, ['class' => 'form-control'] )
</fieldset>
!! Form::close() !!
我们必须在输入中传递索引。就像name="user_phone[0]"
之后我们没有收到错误:
htmlentities() expects parameter 1 to be string, array given
和validate()
方法捕获错误。这是我唯一的解决方案。
【讨论】:
以上是关于将元素数组存储到数据库(Laravel)的主要内容,如果未能解决你的问题,请参考以下文章
如果使用 php (laravel) 未定义数组元素,则将 null 插入数据库