2016-07-12 4 views
1

У меня есть категория (Категория модели).Получить последнюю запись для каждой категории в одном запросе | Yii2

Каждая категория имеет дочерние категории (через поле модели модели parent_id).

Каждая детская категория имеет продукты (через поле продукта category_id).

Мне нужно получить последний добавленный продукт для каждой родительской категории. И в идеале это должно выполнить один запрос. Или как можно меньше запросов.


Я думаю, что он должен работать по отношению и выглядит примерно так:

$areas = Category::find() 
    ->parent() 
    ->published() 
    ->orderBy('position ASC') 
    ->with('latestProduct') 
    ->limit(8) 
    ->asArray() 
    ->all(); 

public function getLatestProduct() 
{ 
    return $this->hasOne(Product::className(), ['category_id' => 'id']) 
     ->viaTable('category', ['parent_id' => 'id']) 
      ->published() 
      ->with('firstImage') 
      ->orderBy('date_create DESC'); 
} 

Этот фрагмент кода не работает, как ожидалось. Правильно ли это написано и как я должен выполнять эту задачу?

+0

вы можете добавить время столбец штамп в базе данных для каждого продукта вы добавляете, используя метку времени вы можете написать запрос, чтобы получить результаты – JKLM

+0

если у вас есть relation'category_table с product_table и firstImage', то вы можете использовать как 'продукт .firstImage', то вы можете добавить условие с этим. –

ответ

-1

В вашей модели Category вы можете сделать что-то вроде этого.

public function latestProducts() 
{ 
    return Product::find()->where(['category_id' => $this->id])->published()->with('firstImage')->orderBy('date_create DESC')->all(); 
} 

В вашей точке зрения для циклизации для каждой категории вызовите эту функцию, как показано ниже.

$category->latestProducts(); // where $category is the current category in loop 
+0

И тогда у нас столько запросов, сколько категорий в цикле. Это не подходящее решение. Я хочу сделать это в наименьшем количестве запросов. – Alliswell

+0

Ну, вы не упоминали об этом в своем первоначальном вопросе, так что нисходящий технически правильный ответ немного сурова для того, кто ищет помощи. – yetanotherse

+0

Да, извините за это. Я удалю downvote, когда ограничение на 12 часов исчезнет. Я сказал это случайно. Любые идеи по моей задаче? – Alliswell

Смежные вопросы