0

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`;
4

2 に答える 2

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
  )
);
于 2014-05-19T09:00:35.387 に答える
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'
                )
            )
        )
    )
);

あなたが持っていると仮定すると、上記のコードはトリックを行うはずです(私があなたの質問を正しく理解していれば):

  • トランザクション hasMany TransactionItem
  • TransactionItem hasOne Product
  • 製品には多くのサプライヤーがいます

モデルの名前が異なる場合は、適切なモデル名を反映するように例を変更する必要があります。関係が違うと、うまくいかないかもしれません..

また、ContainableBehaviorもご覧ください。

于 2012-04-14T14:46:05.733 に答える