2012-04-14 2 views
0

У меня есть вопрос, связанный со сложными условиями поиска в cakephp. У меня есть таблица транзакций, у которой есть много transaction_item (это таблица со структурой product_id, дата), и у продуктов есть много-много связей с поставщиками. Поэтому я использую таблицу карт для продуктов и поставщиков, а в таблице transaction_item я использую внешний ключ для транзакции. Мой вопрос, как я могу прочитать поставщиков и связанные с ними продукты, зная идентификатор транзакции.Комплексный запрос в пироге Php

пример.

Зная transaction.id = 9;

Я хочу результата

Supplier id:1 
    Transaction Item 1 
    Transaction Item 2 
Supplier id:2 
    Transaction Item 1 
    Transaction Item 3 

В SQL мой запрос

SELECT 
     `map_table`.`supplier_id`, 
     `transaction_item_table`.`id` 
    FROM 
     `transaction_item_table` 
     INNER JOIN `map_table` 
      ON `transaction_item_table`.`id` = `map_table`.`product_id` 
    WHERE  
     `transaction_item_table`.`transaction_id` = 9 
    ORDER BY 
     `map_table`.`supplier_id`; 
+0

для будущего, при размещении на ваши вопросы, если вы хотите форматировать, чтобы посмотреть, как набранный без HTML, просто выделите область содержимого и нажмите кнопку открытия/закрытия фигурных скобок над областью редактирования, чтобы «форматировать» вместо прямого HTML. – DRapp

ответ

0

В TransactionController в функции, где вы хотите, чтобы получить этот список:

$transactionId = 9; //For your example ;-) 
$this->Transaction->Behavior->attach('Containable'); 
$result = $this->Transaction->find(
    'first', 
    array(
     'conditions' => array(
      'Transaction.id' => $transactionId 
     ), 
     'contain' => array(
      'TransactionItem' => array(
       'Product' => array(
        'Supplier' 
       ) 
      ) 
     ) 
    ) 
); 

Приведенный выше код должен сделайте трюк (если я правильно понял ваш вопрос), предположив, что у вас есть:

  • Transaction hasMany TransactionItem
  • TransactionItem hasOne Продукт
  • hasMany продукта Поставщик

Если модели имеют разные имена, вы, возможно, придется изменить свой пример, чтобы отразить соответствующие названия модели. Если отношения различны, он не может работать на всех ..

Кроме того, посмотрите на ContainableBehavior

0
$this->TransactionItemTable->find('all', 
    array( 
     'fields' => array(
       'MapTable.supplier_id', 
       'TransactionItemTable.id' 
    ), 
    'joins' => array(
     array(
      'table' => 'map_table', 
      'alias' => 'MapTable', 
      'type' => 'INNER', 
      'conditions' => array(
       'TransactionItemTable.id = MapTable.product_id' 
      ) 
     ), 

    ), 
    'conditions' => array('TransactionItemTable.transaction_id' => 9), 
    'order' => array('MapTable.supplier_id'=> 'ASC'), 
    'recursive' => -1 
) 
); 
Смежные вопросы