2016-02-13 101 views
0

我很难检索一个Eloquent模型,并通过它,然后将其添加到另一个表。重申通过数组并添加到数据库 - Laravel/Eloquent/PHP

所以这里是我的查询;

$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。在DB中不会创建order_itemsorder_item_modifiers。我也没有从laravel

得到任何错误我肯定是做错了我的循环或我如何访问内部数组。任何帮助赞赏。

+0

您的''$ fillable''数组是否包含批量赋值字段? – arma

+0

@arma是所有在我的“模型”中声明的 –

+0

您的查询是否实际返回对象数组,或者它只是您的调试输出?看起来应该是'$ cart-> id''和'$ order_item-> id''和'$ order_modifier_item-> id''。 – arma

回答

0

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

你被欺骗了一点Model魔法。当您倾销您的$cart对象以查看其中的内容时,它会调用一系列函数将您的模型转换为json对象。在调用关系数据的方法中,它将关系名称从camelCase转换为snake_case,并将其添加到json对象。因此,即使您的Model具有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等)。

+0

Lol @'magic' ...干杯队友。很有帮助!感谢您的指导,整理了我的问题。 –