【问题标题】:How To Insert (array values) More then 1 Value From Input Into 1 Row Of Database In Laravel?如何在 Laravel 中将输入中的 1 个以上的值插入(数组值)到 1 行数据库中?
【发布时间】:2019-10-10 11:19:57
【问题描述】:

我有一个像波纹管这样的表格,在我的表格中有超过 1 个输入,其中有 1 个名称,如波纹管:

<form>
<input type="text" name="family">
<input type="text" name="inputCurrName[]">
<input type="text" name="inputCurrName[]">
<input type="text" name="inputCurrName[]">
<input type="submit" name="submit" value="submit">
</form>

我有一个包含 2 列的表,列名为 Family 和 CurrName

我想在表单提交中将多个名称保存到 CurrName 列的一行中,例如这是我提交时的数据:

Family Input: ali inputCurrName[] Inputs : array(jack,peter,lara)

我只想在数据库中保存 1 条记录,其中包含以下数据:

familyColumn Value: ali | CurrNameColumn Value: {jack,peter,lara}

我使用了下面的代码,但它在数据库中保存了 3 条记录!

$input = $request->all();
for ($i = 0; $i <= count($input['inputCurrName']); $i++) {
  $user_data = [
    'family' => $input['family'],
    'curr_name' => $input['inputCurrName'][$i],
  ];

  User::Creat($user_data);
}

我该怎么办?

【问题讨论】:

    标签: arrays laravel forms input


    【解决方案1】:

    您正在执行for loop 检查inputCurrName 的长度,因此它循环遍历每个inputCurrName,这就是为什么每个FamilyName 获得3 条记录的原因。在这种情况下,您只需关心每个 FamilyName 的 1 条记录。

    有几种方法可以将array 的inputCurrName 值插入到带有FamilyName 的1 条记录中。

    您可以使用serialize() 创建一个值的可存储表示,并在从数据库中检索时使用unserialize() 对其进行解码。

    -或-

    您可以在插入记录时使用implode() 创建一个逗号分隔的列表。从数据库中检索后,使用explode() 遍历每个逗号分隔值。

    -或-

    如果您更喜欢 json,您可以对 json_encode() 和 json_decode() 执行相同的操作,方法与 serialize() 和 unserialize() 相同

    +------------+---------------------------------------------------------+
    | FamilyName |                        CurrName                         |
    +------------+---------------------------------------------------------+
    | Ali        |  a:3:{i:0;s:5:"Laura";i:1;s:6:"Peter ";i:2;s:4:"Jack";} |
    | Ali        |  Laura,Peter,Jack                                       |
    +------------+---------------------------------------------------------+
    

    使用以下代码将为您提供上表的示例。 curr_name_optional 是 $user_data array 的一部分,用于展示 implode()。

    <?php
    if(isset($_POST) && count($_POST) > 0) {
    
        $inputFamilyName  = $_POST['family'];
        $inputCurrentName = $_POST['inputCurrName'];
    
        // Your laravel code here..
        $user_data = [
          'family' => $inputFamilyName,
          'curr_name' => serialize($inputCurrentName),
          'curr_name_optional' => implode(',', $inputCurrentName),
          'curr_name_optional_1' => json_encode($inputCurrentName)
        ];
    
        echo "<pre>";
        print_r($user_data);
        echo "</pre>";
    }
    ?>
    
    <form method="post">
        Family Name: <input type="text" name="family"/> <br/>
        Curr Name: <input type="text" name="inputCurrName[]"/><br/>
        Curr Name: <input type="text" name="inputCurrName[]"/><br/>
        Curr Name: <input type="text" name="inputCurrName[]"/><br/>
        <input type="submit" name="submit" value="submit"/>
    </form>
    

    另外,我会确保在插入数据库之前修剪和清理表单输入数据。

    【讨论】:

    • 非常感谢@Woodrow,您的 3 种方法都奏效了! .哪种方式更好更标准?
    • 你能告诉我如何在 Laravel Blade 中以这样的漂亮视图显示序列化、内爆、json_encode 数据吗?>> FamilyName:: Ali , CurrName:: Laura,Peter,Jack
    • 我想在 laravel Blade 中这样显示:link
    【解决方案2】:

    您可以简单地使用foreach,然后将数据转换为json格式,然后插入到一行中

    $arr = [];
    foreach($request->get('inputCurrName') as $key => $value){
       $arr[$key] => $value;
    }
    $user_data = [
          'family' => $request->get('family_name'),
          'curr_name' => json_encode($arr),
         ];
    
    User::Create($user_data);
    

    不确定它是如何工作的,但是您似乎忘记在表单中传递csrf-token。在&lt;form&gt; 标签下方添加@csrf。

    【讨论】:

    • 谢谢,@Woodrow 的方法很有效,我已经测试了你的解决方案,但它在 $arr[$key] =&gt; $arr[$value]; 上有语法错误
    猜你喜欢
    • 2018-06-16
    • 2013-01-06
    • 2020-03-26
    • 1970-01-01
    • 2015-12-03
    • 2021-10-06
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多