2012-04-14 12 views
0

Ich habe eine Frage im Zusammenhang mit komplexen Bedingungen finden in CakePHP. Ich habe eine Transaktionstabelle, die viele transaction_item hat (ist eine Tabelle mit Struktur product_id, date) und die Produkte haben viele zu viele Verbindung mit den Lieferanten. Also verwende ich eine Map-Tabelle für Produkte und Lieferanten und in der Tabelle transaction_item verwende ich einen Fremdschlüssel für die Transaktion. Meine Frage, wie kann ich die Lieferanten und ihre verwandten Produkte lesen, wenn ich die Transaktions-ID kenne.Komplexe Abfrage in Kuchen Php

Beispiel.

Wissen transaction.id = 9;

möchte ich das Ergebnis

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

In SQL meiner Anfrage

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

für Zukunft, wenn Ihre Fragen veröffentlichen, wenn Sie wollen die Formatierung ohne HTML als getippt aussehen, Markieren Sie einfach den Inhaltsbereich und klicken Sie auf die Schaltfläche zum Öffnen/Schließen der geschweiften Klammer über dem Bearbeitungsbereich, um anstelle von direktem HTML-Code "Formatieren" zu verwenden. – DRapp

Antwort

0

In TransactionController in der Funktion ist, wo Sie diese Liste erhalten möchten:

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

Above Code sollte Mach den Trick (wenn ich deine Frage richtig verstanden habe), vorausgesetzt du hast:

  • Transaktion hasMany TransactionItem
  • TransactionItem hasOne Produkt
  • Produkt hasMany Lieferant

Wenn die Modelle unterschiedliche Namen haben, werden Sie wahrscheinlich mein Beispiel müssen ändern die entsprechenden Modellnamen widerzuspiegeln. Wenn die Beziehungen unterschiedlich sind, ist es nicht überhaupt funktionieren könnte ..

Außerdem haben Sie einen Blick auf 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 
) 
);