Подзапросы в CakePHP 3?

У меня есть две таблицы products и product_categories, которые связаны через третью таблицу products_categories_products в соответствии с соглашениями CakePHP BelongsToMany (Edit: эти ассоциации установлены в ProductsTable.php и ProductCategoriesTable.php). Я хочу создать список категорий продуктов, используя изображения самых продаваемых продуктов для представления каждой категории.

Я могу достичь желаемого результата, используя следующую функцию:

public function findImages(Query $query, array $options) {
    $query->select([
        'ProductCategories.id',
        'ProductCategories.name',
        'ProductCategories__image' => '(SELECT Products.image
        FROM product_categories_products AS ProductCategoriesProducts
        LEFT JOIN products AS Products
        ON ProductCategoriesProducts.product_id = Products.id
        WHERE ProductCategoriesProducts.product_category_id = ProductCategories.id
        ORDER BY Products.turnover DESC
        LIMIT 1)'
    ])->where([
        'ProductCategories.name <>' => 'Unsorted'
    ])->order([
        'ProductCategories.name'    => 'asc'
    ]);
    return $query;
}

Это приемлемо, или есть способ достичь моей цели проще простого? Я не смог найти ничего по теме создания подзапросов в CakePHP 3. Я просто наткнулся на вышеуказанное решение после пары часов разочарования. Любые советы приветствуются!


person Libertie    schedule 24.11.2015    source источник
comment
Вы правильно составили ассоциации в модели? Если да, то что бы вы могли изменить в вопросе, чтобы указать, что у вас есть?   -  person chrisShick    schedule 25.11.2015
comment
Спасибо за ответ, Крис! Я отредактировал свой вопрос, чтобы отразить расположение ассоциаций модели.   -  person Libertie    schedule 25.11.2015
comment
Я имел в виду, можете ли вы опубликовать фактический код, чтобы мы могли видеть, каковы фактические ассоциации   -  person chrisShick    schedule 26.11.2015
comment


Ответы (1)


Благодаря ссылке пользователя ndm_yesterday я создал следующее решение:

public function findImages(Query $query, array $options) {
    $this->hasMany('ProductCategoriesProducts');

    $subquery = $this->ProductCategoriesProducts->find('all')->select([
        'Products.image'
    ])->join([
        [
            'table'     => 'products',
            'alias'     => 'Products',
            'type'      => 'LEFT',
            'conditions'=> [
                'ProductCategoriesProducts.product_id = Products.id'
            ]
        ]
    ])->where([
        'ProductCategoriesProducts.product_category_id = ProductCategories.id'
    ])->order([
        'Products.turnover' => 'DESC'
    ])->limit(1);

    $query->select([
        'ProductCategories.id',
        'ProductCategories.name',
        'ProductCategories__image' => $subquery
    ])->where([
        'ProductCategories.name <>' => 'Unsorted'
    ])->order([
        'ProductCategories.name'    => 'asc'
    ]);

    return $query;
}
person Libertie    schedule 29.11.2015