在Laravel的数据库中存储数组数据[重复]

Storing array data in the database in Laravel [duplicate]

提问人:GelS Sy 提问时间:11/17/2023 最后编辑:ADysonGelS Sy 更新时间:11/17/2023 访问量:82

问:

我试图将数组数据存储在数据库中,我没有收到错误消息,它没有将其存储在数据库中。这是我在边栏选项卡文件中的代码

<form method="post" action="{{route('CheckOut')}}" enctype="multipart/form-data">
    @csrf
    <div class="container">
        Name: <input type="text" name="costumer_name" value=""/>
        Address: <input type="text" name="costumer_address" value=""/>
        Contact Number <input type="text" name="costumer_number" value=""/>
    </div>
    @foreach ($carts as $cart)
        <div class="product">
            <div class="product-details">
                <input type="text" name="product[]" value="{{ $cart->product }}" />
            </div>
            <div class="product-quantity">
                <input type="number" value="{{ $cart->quantity }}" min="1" name="quantity[]">
            </div>
            <div>
                <a href="{{ route('remove', $cart->id) }}" class="btn btn-danger btn-sm">Remove</a>
            </div>
            <div>{{ $cart->subtotal }}</div>
        </div>
    @endforeach
    <input type="hidden" id="check_out_value" value="CheckOut" readonly/>
    <input type="submit" id= "checked_out_button" class="checkout" Value="Checkout">
</form>

我试图将costumer_namecostumer_address costumer_number与循环中的数据(即 product[] 和 id 为自动递增的 quantity[] 一起存储。

这是我在控制器中的代码

public function CheckOut(Request $request)
{
    $name = $request->costumer_name;
    $address = $request->costumer_adress;
    $number = $request->costumer_number;
    $products = $request->product;
    $quantity = $request->quantity;

    $data=[];
    foreach($products as $product) {
        $data[]=[
            'name'              => $name,
            'address'           => $address,
            'number'            => $number,
            'product'           => $product,
            'quantity'          => $quantity
        ];
    }
    Order::insert($data);
}

它给了我错误

数组到字符串的转换

数据库中的预期输出:

编号 名字 地址 产品 数量
1 John 菲利市 093-256-31 产品1 100
2 John 菲利市 093-256-31 产品2 200
php mysql 拉维尔

评论

1赞 CBroe 11/17/2023
contentType: false告诉jQuery根本不发送任何标头,这意味着接收方将不知道如何解析请求正文。删除它。Content-Type
0赞 GelS Sy 11/17/2023
@CBroe我刚才试过,它仍然没有存储任何东西。
0赞 CBroe 11/17/2023
检查请求在浏览器开发工具中是否正常,并转储服务器端接收到的参数。
1赞 Pippo 11/17/2023
@GelSSy在您的 JS 代码中有一个 .then,这是一个不依赖于任何对象的方法......这似乎是在不了解上下文的情况下复制粘贴某些代码
1赞 ADyson 11/17/2023
好吧,你应该重写你的代码,这样它就不会尝试将数组输出或存储为文本格式。数组没有固有的可视化表示,所以如果(例如)你要求 PHP 对数组进行处理,或者尝试将其写入字符串变量,它将失败,因为它不知道你希望数组的文本视图是什么样子的。如果需要将数组数据转换为文本格式,则需要自己编写代码以希望看到的方式格式化它。您也没有告诉我们 - 您的代码中究竟有哪一行抛出该错误?echo

答:

-1赞 SdeWijs 11/17/2023 #1

在我看来,您正在对 Order::insert() 进行批量分配。您在订单模型中插入的所有字段是否都$fillable数组?文档

你的订单模型应该包含这样的东西,甚至可以像你现在所做的那样插入任何数据:

protected $fillable = ['name', 'address', 'number', 'product', 'quantity']

否则,您将获得当前结果,并且不会在您的订单表中实际存储任何内容。

评论

0赞 GelS Sy 11/17/2023
是的,所有字段都$fillable在模型中。如果不在控制器中使用 foreach,它只会将最后一个数据存储在我的刀片中,我想要我的刀片文件中显示的所有内容。
1赞 Pippo 11/17/2023
Insert() 不需要$fillable,允许在一次调用中输入多个记录,但不会填充日期。
1赞 ADyson 11/17/2023 #2

你得到的原因

数组到字符串的转换

是因为你插入的是一个数组,但试图把它放到一个文本字段中。$quantity

您需要从数量数组中选择与您要插入的产品匹配的项目。如果使用循环遍历产品,则可以使用循环计数器轻松地从产品和数量数组中选择正确的项目。for

例如:

$data=[];
for($i = 0; $i < count($products); $i++) {
    $data[]=[
        'name'              => $name,
        'address'           => $address,
        'number'            => $number,
        'product'           => $products[$i],
        'quantity'          => $quantity[$i]
    ];
}
Order::insert($data);

评论

0赞 GelS Sy 11/17/2023
我一直在寻找我的问题,但我似乎没有找到正确的答案。谢谢。
0赞 mickmackusa 11/22/2023
我添加了更多重复目标,这些目标实际上演示了如何处理包含不可重复和可重复字段混合的表单提交。怎么样 ?Order::insert(array_map(fn($p, $q) => ['name' => $name, 'address' => $address, 'number' => $number, 'product' => $p, 'quantity' => $q], $products, $quantity));