2016-08-03 2 views
0

У меня есть 3 таблицы, categories, products и seller_products и их объединения, как CategoriesTable.phpCakePHP 3: многоуровневое объединение

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

ProductsTable.php

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

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

ПродавецProductsTable.php

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

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

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

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

Edit 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

+0

Кажется очень простой задачей, что вы делали до сих пор? – arilia

+0

@arilia см. 'Edit 2' –

ответ

2

вместо того, чтобы присоединиться к вам может просто содержать 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']); 
+0

Это дает результат в массиве' 2D', в котором 1-й массив содержит 'products', а 2-й массив содержит все' sellerProducts', связанные с этим продуктом. Я хочу, чтобы все данные были в одном массиве, потому что позже я должен запустить многие другие функции, чтобы найти «min (« sales_price ») и max (« sales_price »), которые находятся в' salesProducts'. а также получить только одного продавца с каждым продуктом с минимальным «sell_price» и т. д. Я думаю, что эти функции будут легко запускать позже в результате объединения. –

+0

Я добавил альтернативное решение, см. Мое редактирование – arilia

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