#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 для просмотра..