CakePHP 3: многоуровневая ассоциация

У меня есть 3 таблицы, categories, products и seller_products, и их ассоциации похожи на CategoriesTable.php.

$this->hasMany('Products', [
   'foreignKey' => 'category_id'
]);

ProductsTable.php

$this->hasMany('SellerProducts', [
    'foreignKey' => 'product_id'
]);

$this->belongsTo('Categories', [
    'foreignKey' => 'category_id',
    'joinType' => 'INNER'
]);

SellerProductsTable.php

$this->belongsTo('Products', [
    'foreignKey' => 'product_id',
    'joinType' => 'INNER'
]);

Теперь в view из categories (site.com/categories/view/2) мне нужно выбрать все данные о продуктах из products и sellerProducts, где продукты принадлежат идентификатору категории, а также существуют в продавцах. т.е.,

products.category_id = $id AND sellerProducts.product_id = Products.id

Есть ли простой способ получить результат в CakePHP 3?

Редактировать 2

Это то, что я пытаюсь. В view() действии CategoriesController.php

$this->loadModel('Products');
        $sellerProducts = $this->Products->find('all', [
          'conditions' => [
            'category_id' => $id
          ],
          'joins' => [
              'table' => 'SellerProducts',
              'alias' => 'SellerProducts',
              'type' => 'INNER',
              'conditions' => [
                'SellerProducts.product_id' => 'Products.id',
                'stock >' => 0
              ]
            ]
        ]);
        debug($sellerProducts);
        foreach($sellerProducts as $a) {
          debug($a);
        }

на debug он дает только данные из таблицы Products, но не из SellerProducts


person Anuj TBE    schedule 03.08.2016    source источник
comment
Кажется, очень простая задача, что вы пробовали до сих пор?   -  person arilia    schedule 03.08.2016
comment
@arilia см. edit 2   -  person Anuj TBE    schedule 03.08.2016


Ответы (1)


вместо соединения вы можете просто содержать SellerProducts

$this->Products->find()
    ->where(['category_id' => $id])
    ->contain(['SellerProducts' => function($q) {
        return $q->where(['stock >' => 0])
    }]);

если вы хотите запросить данные от продавца продуктов, вы можете сделать

 $this->Products->SellerProducts->find()
    ->where([
         'Products.category_id' => $id
         'SellerProducts.stock >' => 0])
    ->contain(['Products', 'Products.Categories']);
person arilia    schedule 03.08.2016
comment
это дает результат в массиве 2D, в котором 1-й массив содержит products, а 2-й массив содержит все sellerProducts, связанные с этим продуктом. Я хочу, чтобы все данные были в одном массиве, потому что мне нужно запускать много других функций позже для извлеченных данных, например, чтобы найти min('selling_price') и max('selling_price'), которые находятся в sellerProducts. а также получить только одного продавца с каждым товаром с минимумом selling_price и т. д. Я думаю, что эти функции будет легко запустить позже по результату соединения. - person Anuj TBE; 03.08.2016