Чтобы продемонстрировать свою проблему, я создал фиктивную базу данных с этими 4 таблицами (определенными как модели Eloquent): User, Product, ShoppingItem (сокращенно: Item em>), Порядок; со всеми их соответствующими отношениями. (Пользователь включен сюда только для полноты)
Продукты:
- id
- имя
- hasMany (элемент)
Заказы:
- id
- ID пользователя
- Дата
- hasMany (элемент)
Предметы:
- id
- идантификационный номер продукта
- номер заказа
- ownTo (Продукт)
- ownTo (Заказ)
Таким образом, записи (Покупки) Items создаются всякий раз, когда покупатель покупает некоторые продукты. Заказ (корзина) также создается и содержит 1 или несколько Товаров, принадлежащих только одному покупателю (Пользователю) и его текущим покупкам. процесс.
Теперь эта проблема касается списка продуктов и способа анализа их «успешности». Как часто они продаются и когда они продавались в последний раз?
Я могу, например, использовать следующий запрос, чтобы получить все заказы для одного продукта и, следовательно, подсчитать, как часто они продаются:
$orders = Order::whereHas('items', function ($query) use ($id) {
$query->where('product_id', $id)
->where('date', '<', Carbon::now());
})->orderBy('date', 'desc')->get();
Кроме того, я могу получить список всех заказанных продуктов по количеству времени, в течение которого они были проданы, с помощью этого:
$products = Products::withCount('items')
->orderBy('item_count', 'desc');
Но я хочу получить список всех продуктов, отсортированный по дате последнего заказа (покупки). Этот результат должен быть запросом Eloquent или набором Query Builder, чтобы я мог использовать разбиение на страницы в теме.
У меня есть мутатор, определенный в моей модели продукта, например:
public function getLastTimeSoldAttribute( $value ) {
$id = $this->id;
// get list of plans using this song
$order = Order::whereHas('items', function ($query) use ($id) {
$query->where('product_id', $id)
->where('date', '<', Carbon::now());
})->orderBy('date', 'desc')->first();
return $order->date;
}
Он возвращает дату последней покупки этого продукта, и я могу использовать его в представлении следующим образом:
{{ $product->last_time_sold }}
Однако я не могу использовать «last_time_sold» в выражении Eloquent OrderBy!
Есть ли другой способ получить значение «last_time_sold» продукта в отношениях с базой данных, как описано выше, без потери возможности выполнять разбиение на страницы?
В конечном итоге, как правильно запрашивать таблицу "Товары" и заказывать товары по дате их последнего заказа?
Имейте в виду, что у предметов нет даты, только у заказа (корзины покупок) есть дата.
$query ->where('date', '<', Carbon::now());
должно работать? - person Sanzeeb Aryal   schedule 04.10.2016$items = Item::with('product','order')->orderBy('product_id','date')
но это дает список всех товаров, а не всех продукты (что намного меньше). - person matthiku   schedule 21.10.2016