Отображение категории и подкатегории при просмотре заказов администратором

#php #laravel-4

#php #laravel-4

Вопрос:

Когда клиент отправляет свой заказ, он сохраняется в таблице базы orders данных в виде массива. Массив выглядит следующим образом:

 {
    "15": // product_id
    {
        "title":"Test of title", // product_title
        "description":"Test of description", // product_description
        "quantity":1,
        "price":132 
    },
    "shipping": // selected shipping information
    {
        "title":"Normal Delivery" - $10.00",
        "price":10
    }
}
  

Тогда в моем заказе Model у меня есть это

 public function getOrderData($data) { 
    return json_decode($data); 
}
  

В контроллере

 public function orders() {

    $orders = Order::select('*')->paginate(10);
        return View::make('admin.orders', [
            'orders' => $orders
        ]);
}
  

В представлении я сделал один foreach и отображаю информацию для заказа из этого массива, например

 @foreach($order->getOrderData($order->data) as $itemId => $item)     
    Title of product
    Description of product
    Price of product        
@endforeach
  

То, что я хочу сделать, это тот же вид, но перед Title of product отображением также названия категории и названия подкатегории, например

 @foreach($order->getOrderData($order->data) as $itemId => $item) 

    Category 1 -> Sub_category 1 -> Title of product
    .... // other info
@endforeach
  

Проблема: у меня вообще нет ничего для category и sub-category в этом массиве и в таблице заказов. Пытался объединить категорию таблиц и подкатегорию, но у них нет столбцов в order таблице, только в product таблице, которую я храню category_id и sub_category_id .

Как я могу их показать?

Обновление 2: изменено getOrderData в модели заказа следующим образом

 public function getOrderData($data) {

    $dataArray = json_decode($data, true);
    $data = json_decode($data);
    $arrayKeys = array_keys($dataArray);
    $arrayKeys = array_filter($arrayKeys, function($value) {
        return ($value !== 'shipping');
    });
    $productIds = implode(',', $arrayKeys);

    $products = 
        DB::table('products')
        ->join('category', 'products.product_id', '=', 'category.category_id')
        ->join('sub_category', 'products.sub_cat_id', '=', 'sub_category.sub_cat_id')
        ->whereIn('product_id',$productIds) ;



    foreach ($products as $item) {
        if(!in_array($item['product_id'], $arrayKeys)) continue;
        $dataArray[$item['product_id']]['category'] = $item['category']; // depending on the implementation $item may be array or an object! so this code may vary
        $dataArray[$item['product_id']]['subcategory'] = $item['subcategory'];
    }
    return (object) $dataArray;   
  //return json_decode(json_encode($dataArray));        
} 
  

Ошибка:

array_keys() ожидает, что параметр 1 будет массивом, заданным объектом

Обновление: этот запрос в phpmyadmin возвращает мне всю информацию о продукте с id = 9 всю информацию для категории и подкатегории

 SELECT * 
FROM products AS p
LEFT JOIN category AS c ON p.category_id =1
LEFT JOIN sub_category AS sc ON p.sub_cat_id =1
WHERE p.product_id =9
  

Ответ №1:

Я могу дать вам это решение: после получения результата для заказа из таблицы вы можете выполнить итерацию по заказу, чтобы получить идентификаторы продуктов. Затем выполните запрос select, подобный этому:

 SELECT fields FROM products AS p
JOIN categories AS c ON ...
JOIN sub_categories AS sc ON ...
WHERE p.id IN (productIDs)
  

И код для получения идентификаторов продуктов выглядит примерно так:

 public function getOrderData($data) {
    $dataArray = json_decode($data, true);
    $data = json_decode($data);
    $arrayKeys = array_keys($dataArray);
    $arrayKeys = array_filter($arrayKeys, function($value) {
        return ($value !== 'shipping');
    });
    $productIds = implode(',', $arrayKeys);

    // QUERY FOR selecting product categories, so when this query return results you can merge them with order data.
    $productsInfo = ....

    foreach ($productsInfo as $item) {
        if(!in_array($item['productId'], $arrayKeys)) continue;
        $dataArray[$item['product_id']]['category'] = $item['category_name']; // depending on the implementation $item may be array or an object! so this code may vary
        $dataArray[$item['product_id']]['subcategory'] = $item['sub_cat_name '];
    }

    // If products is array of objects use this code
    //foreach ($productsInfo as $item) {
    //    if(!in_array($item->productId, $arrayKeys)) continue;
    //    $dataArray[$item->product_id]['category'] = $item->category_name; // depending on the implementation $item may be array or an object! so this code may vary
    //    $dataArray[$item->product_id]['subcategory'] = $item->sub_cat_name ;
    //}
    return (object) $dataArray;
}
  

Если return (object) $dataArray; не дает вам ту же структуру ответа, что и в ответе на ваш вопрос, тогда:

 return json_decode(json_encode($dataArray)); // for example
  

Если вы добавите дополнительную информацию о структуре таблицы, я могу дать вам лучший ответ.

Комментарии:

1. Спасибо за ответ. Запрос в порядке, я могу изменить свои поля. Что я не понимаю, как это сделать After getting the result for the order from the table you can iterate over the order to get productIDs , можете ли вы привести мне пример?

2. Я отредактировал свой ответ и добавил код, который вы просили.

3. Спасибо. Я обновил свой вопрос тем, что я пробовал, и какая ошибка у меня есть. Итак, я попытался реализовать ваше решение, но пока получил эту ошибку.

4. Хорошо, я понял. Просто отредактировал ответ… немного некрасиво иметь два json_decode, но я не знаю, будет ли это проблемой для вашей реализации $data быть массивом, поэтому я добавил еще один $ dataArray 🙂

5. Я рад, что мы наконец добрались до решения проблемы.

Ответ №2:

Попробуйте это 😉

Когда вы это делаете json_decode , это преобразует ассоциативный массив в объекты, поэтому вы получаете эту ошибку при передаче этих декодированных данных json; Поэтому перед использованием этих декодированных данных cast необходимо array ;

 $data = (array) json_decode($data);
  

Комментарии:

1. Спасибо. Работал также так. Теперь проблема в том, как вернуть оба результата из запроса $data для просмотра..