将元素数组存储到数据库(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

当我用数据填充所有输入时,一切正常。

【问题讨论】:

您可以使用phpimplode函数并将逗号分隔的值存储到数据库中.. 【参考方案1】:

我认为问题出在你的规则

'user_phone' => 'required

要验证数组值,您应该使用数组验证。 (Link)

像这样重写你的规则

"user_phone.0" => "required"

这将确保至少提供一个 user_phone。

如果您想验证电话格式,请使用:

"user_phone.*" => "Insert validation here"

【讨论】:

Form::text('user_phone[]', null, ['class' =&gt; '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)的主要内容,如果未能解决你的问题,请参考以下文章

如何将值从数据库中的laravel存储到数组中?

Laravel 存储/插入数组值到数据库 Mysql

如果使用 php (laravel) 未定义数组元素,则将 null 插入数据库

如何将数组数据保存到 Laravel postgres 中?

如何将变量存储到数组里面?

可以将数组值存储在数据库中并在 Laravel 中使用 where 子句吗?