Cake Php中的复杂查询

时间:2012-04-14 13:54:39

标签: php mysql cakephp find

我有一个与cakephp中复杂查找条件相关的问题。 我有一个交易表,它有许多transaction_item(是一个结构为product_id的表,日期),并且产品与供应商有多对多的连接。所以我使用产品和供应商的地图表,在transaction_item表中我使用外键进行交易。我的问题是如何知道交易ID的供应商及其相关产品。

例如

了解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`;

2 个答案:

答案 0 :(得分: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 Product
  • 产品有许多供应商

如果模型具有不同的名称,您可能必须修改我的示例以反映相应的模型名称。如果关系不同,它可能根本不起作用..

另外,请查看ContainableBehavior

答案 1 :(得分: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
  )
);