重复数组并添加到DB - Laravel / Eloquent / PHP

时间:2016-02-13 03:09:04

标签: php arrays laravel laravel-5 eloquent

我在检索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,
                ]);
            }
        }
    }
}

我的代码只有orderorder_itemsorder_item_modifiers未在DB中创建。我也没有从laravel

收到任何错误

我肯定是在做我的循环或者我如何访问内部数组。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您的问题是$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等)访问它的属性。