【问题标题】:Complex Query in Cake PhpCake Php 中的复杂查询
【发布时间】:2012-04-14 13:54:38
【问题描述】:

我有一个与 cakephp 中复杂的查找条件相关的问题。 我有一个交易表,其中包含许多 transaction_item(是一个结构 product_id,date 的表),并且产品与供应商有多对多的联系。所以我对产品和供应商使用映射表,在 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`;

【问题讨论】:

  • 为了将来,在发布您的问题时,如果您希望格式化看起来像没有 HTML 的类型,只需突出显示内容区域并单击编辑区域上方的打开/关闭花括号按钮以“格式化”而不是直接使用 HTML。

标签: php mysql cakephp find


【解决方案1】:

在 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'
                )
            )
        )
    )
);

上面的代码应该可以解决问题(如果我正确理解你的问题),假设你有:

  • 事务有很多事务项
  • TransactionItem 有一个产品
  • 产品有很多供应商

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

另外,看看ContainableBehavior

【讨论】:

    【解决方案2】:
    $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
      )
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2013-06-28
      • 2020-04-06
      相关资源
      最近更新 更多