Frage

Was ich habe:

"A" HABTM "C" HABTM "A" through join table "B"
"A" hasMany "B" belongsTo "A"
"C" is ordered by a "B" field

Was ich will:

// result:
[0] => array( 
    A => array( /* single model's fields I still need*/ ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* Model C fields*/ ), 
        [1] => array( C.field1, C.field2, ... )
    )
) 

Was habe ich versucht:

// this gives me data I don't need:
A->find('all', array( 'conditions' => array( 'id' => $id ) ) )
// result:
[0] => array( 
    A => array( /* single model's fields I need*/ ),
    B => array( /* I DON'T NEED */
        [0] => array( ... )
        [1] => array( /* ... etc, tons records I don't need */ )
    ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* I need these fields*/ 
            [B] => array( /* I DON'T NEED */ )
        ),
        [1] => array( C.field1, C.field2, ...  )
            [B] => array( /* ... etc, each has a model B I don't need ... */)
        )
    )
)

Mit Contain kann ich die Abfrage ziemlich viel abgeholzt, aber es gibt noch assoziiert Modell cruft:

// this is a little better
A->find('all', array( 
    'conditions' => array( 'id' => $id ),
    'contain' => array( 'C' )
))
// result:
[0] => array( 
    A => array( /* single model's fields I still need*/ ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* I still need Model C fields*/ 
            [B] => array( /* I still DON'T need this Model's fields */ )
        ),
        [1] => array( C.field1, C.field2, ... 
            [B] => array( /* ... still has unneeded model B */)
        )
    )
)

NB1 : Ich habe gelesen, this , diese und diese aus dem Buch sowie dieses und this .

NB2 : Ich habe auch versucht,

C->recursive = -1 // no effect

C->unbindModel(array('hasAndBelongsToMany'=>A)) // no effect

A->find('all', array(                    // not what I want, but it's still 
    'conditions' => array('id' => $id),  // odd that this doesn't filter C's 
    'contain' => array('A.B')));         // fields out. same as second result

A->find('all', array(                    // also not what I want, but it's 
    'conditions' => array('id' => $id),  // weird that this doesn't filter B's 
    'contain' => array('A.B.field')));   // fields at all; 
War es hilfreich?

Lösung

Die ContainableBehavior automatisch Felder zurück, die erforderlich sind, Ergebnisse zu kartieren.

Zitiert aus einem , dass Sie bereits gelesen:

$this->Post->find('all', array('contain' => 'Comment.author'));

... // data returned:

[Comment] => Array
    (
        [0] => Array
            (
                [author] => Daniel
                [post_id] => 1
            )
...
  

Wie Sie sehen können, der Kommentar-Arrays   nur das Autorenfeld enthalten (plus   die post_id die durch CakePHP benötigt wird,   die Ergebnisse zur Karte).

Im Fall von HABTM Beziehungen, verbinden sich das Modell mit dem zugehörigen Fremdschlüssel zurückgegeben wird, da die a_id und c_id Felder durch Contain erforderlich sind. Mein Vorschlag ist, einfach zu ignorieren und nehmen Sie die Werte, die Sie benötigen. Wenn Sie möchten, können Sie nehmen wahrscheinlich einen Blick auf manchmal verbindet weil Contain die DB viele, viele Male abfragt. Allerdings werden die Daten für die dazugehörigen Modelle nicht so schön wie Contain zurückgegeben werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top