通过数组重申并添加到数据库 - Laravel/Eloquent/PHP


Reiterate through array and add to DB - Laravel/Eloquent/PHP

我在检索Eloquent模型并浏览它然后将其添加到另一个表中时遇到困难。

所以这是我的查询;

$cart = Cart::with('cartItems','cartItems.cartModifierItems')->where(['vcode' => $code, 'cookie_id' => $cookie])->first();

这将检索以下内容;

[
  {
    "id": 14,
    "cookie_id": "2e5c22eba9ef7affe78b34e10d35f89dd5fbdd3b",
    "user_id": 3,
    "restaurant_id": 11,
    "restaurant_name": "Gaucho",
    "restaurant_uname": "gaucho",
    "location": "asokoro",
    "city": "abuja",
    "date": "2016-02-11",
    "time": "12:00:00",
    "vcode": "5960010",
    "created_at": "2016-02-09 13:57:34",
    "updated_at": "2016-02-13 02:29:56",
    "cart_items": [
      {
        "id": 88,
        "item_id": 159,
        "restaurant_id": 11,
        "cart_cookie": "2e5c22eba9ef7affe78b34e10d35f89dd5fbdd3b",
        "name": "Empanadas (Choice of 2)",
        "description": "Choice of Diced Beef; Spinach, Stilton and Onion; or Smoked Ham and Mozzarella",
        "price": 700,
        "qty": 5,
        "available": 1,
        "created_at": "2016-02-10 20:42:32",
        "updated_at": "2016-02-11 07:07:51",
        "cart_id": 14,
        "cart_modifier_items": [
          {
            "id": 76,
            "item_id": 34,
            "name": "Diced Beef",
            "price": 50,
            "created_at": "2016-02-10 20:42:32",
            "updated_at": "2016-02-10 20:42:32",
            "cart_item_id": 88,
            "cart_id": 14
          },
          {
            "id": 77,
            "item_id": 35,
            "name": "Smoked Salmon & Mozzarella",
            "price": 50,
            "created_at": "2016-02-10 20:42:32",
            "updated_at": "2016-02-10 20:42:32",
            "cart_item_id": 88,
            "cart_id": 14
          }
        ]
      }
    ]
  }
]

如您所见,有 3 个级别;

顶级是cart中级是cart_items底层是cart_modifier_items

cart可以包含多个cart_items

cart_items可以包含多个cart_modifier_items

我正在尝试做的是获取此输出并将其复制到相同的表中;模型也相同

orderorder_itemsorder_item_modifiers

顶级是order中级是order_items底层是order_item_modifiers

order可以包含多个order_items

order_items可以包含多个order_item_modifiers

这就是我迄今为止所做的;

$order = Order::create([
    'order_id' => $order_number,
    'date' => $cart['date'],
    'time' => $cart['time'],
    'total' => $total,
    'subtotal' => $subtotal,
    'order_status_id' => 1,
    'customer_id' => $id,
    'restaurant_id' => $cart['restaurant_id'],
])->id;
if (!empty($cart['cart_items'])) {
    foreach($cart['cart_items'] as $order_item) {
        $orderItem = OrderItem::create([
            'item_id' => $order_item['id'],
            'name' => $order_item['name'],
            'description' => $order_item['description'],
            'price' => $order_item['price'],
            'qty' => $order_item['qty'],
            'restaurant_id' => $order_item['restaurant_id'],
            'order_id' => $order,
        ])->id;
        if (!empty($order_item['cart_modifier_items'])) {
            foreach ($order_item['cart_modifier_items'] as $order_modifier_item) {
                OrderItemModifier::create([
                    'item_id' => $order_modifier_item['id'],
                    'name' => $order_modifier_item['name'],
                    'price' => $order_modifier_item['price'],
                    'order_id' => $order,
                    'order_item_id' => $orderItem,
                ]);
            }
        }
    }
}

使用我的代码,我得到的只是order.order_itemsorder_item_modifiers不会在DB中创建。我也没有收到任何错误laravel

我的循环或访问内部数组的方式肯定做错了。任何帮助表示赞赏。

您的问题是$cart['cart_items']$order_item['cart_modifier_items']实际上并不存在,因此您的!empty()检查返回false

你被一点点Model魔法所欺骗。当您转储 $cart 对象以查看其中的内容时,它会调用一系列函数将模型转换为 json 对象。在调用以转储关系数据的方法中,它将关系名称从camelCase转换为snake_case,并将其添加到 json 对象中。因此,即使您的模型具有cartItems属性,您的 json 转储也会显示cart_items

因此,快速解决方法是将$cart['cart_items']更改为 $cart['cartItems']$order_item['cart_modifier_items']更改为 $order_item['cartModifierItems']


快速说明:尽管 Laravel 的Model实现了ArrayAccess,这意味着您可以访问$cart['date']$cart['cartItems']等数据,但通常更容易接受将其视为对象并使用箭头语法($cart->date$cart->cartItems 等(访问其属性。