【问题标题】:Reiterate through array and add to DB - Laravel/Eloquent/PHP遍历数组并添加到 DB - Laravel/Eloquent/PHP
【发布时间】:2016-05-24 08:54:25
【问题描述】:

我在检索 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 的任何错误

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

【问题讨论】:

  • 您的$fillable 数组是否包含大量赋值字段?
  • @arma 是的,我的models中都声明了
  • 您的查询实际上是返回对象数组还是只是您的调试输出?看起来应该是 $cart->id$order_item->id$order_modifier_item->id

标签: php arrays laravel laravel-5 eloquent


【解决方案1】:

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

【讨论】:

  • 大声笑@magic...干杯伙伴。非常有帮助!感谢您的指导,解决了我的问题。
猜你喜欢
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多