2 Stimmen

Zend_Db_Table_Abstract Laden von verbundenen Modellen

Ich habe eine Tabelle namens:

Kunde (id, Alias) post (id, subject) post_client (id, post_id, client_id)

Viele Kunden können mit einem Posten verbunden werden.

Mit Zend DB Table abstract habe ich begonnen, ein Modell zu erstellen, hier sind die Klassen:

ORM_Post

class ORM_Post extends Zend_Db_Table_Abstract {

    protected $_name = 'Post';
    protected $_dependentTables = array('ORM_Post_Client');

}

ORM_Client

class ORM_Client extends Zend_Db_Table_Abstract {

    protected $_name = 'Client';
    protected $_dependentTables = array(
        'ORM_Post_Client'
    );
}

ORM_Post_Client

class ORM_Post_Client extends Zend_Db_Table_Abstract {

    protected $_name = 'Post_Client';
    protected $_referenceMap    = array(
        'post' => array(
            'columns'           => 'post_id',
            'refTableClass'     => 'ORM_Post',
            'refColumns'        => 'id'
        ),
        'client' => array(
            'columns'           => 'client_id',
            'refTableClass'     => 'ORM_Post_Client',
            'refColumns'        => 'id'
        )

    );
}

Was ich hoffte zu tun ist, rufen Sie eine Instanz der Post und laden Sie dann die Clients zugeordnet aswell als Laden einer Instanz des Clients und laden Sie alle Beiträge zugeordnet.

Also habe ich dies getan:

    $post = new ORM_Post();
    $results = $post->fetchAll();

    foreach ($results as $key => $result){
        $row = $results->current();
        $client = $row->findDependentRowset('ORM_Post_Client','client');
    }

und ich bekomme Referenzregel "client" verweist nicht auf Tabelle ORM_Post

Ich habe mich stundenlang damit herumgeschlagen und kann nicht erkennen, was ich falsch mache. Bin ich zu deklarieren, die Post_Client verbindet innerhalb der Client und Post-Modell auch?

EDIT

Hier ist, was ich gesucht habe:

    $post = new ORM_Post();
$results = $post->fetchAll();
$return = array();

    foreach ($results as $result){
        $row = $post->find($result->id)->current();
        $return[$result->id] = $row->toArray();
        $return[$result->id]['clients'] = $row->findManyToManyRowset('ORM_Client', 'ORM_Post_Client')->toArray();
}

return $return;

Danke für die Ratschläge, Jungs, ihr habt mich auf den richtigen Weg gebracht.

3voto

Mouna Cheikhna Punkte 36934

In Ihrem ORM_Post_Client sollte es sein

'client' => array(
            'columns'           => 'client_id',
            'refTableClass'     => 'ORM_Client',  //instead of ORM_Post_Client 
            'refColumns'        => 'id'
        )

refTableClass => Der Klassenname der übergeordneten Tabelle. [ ] Namen, nicht den physischen Namen der SQL-Tabelle ( Dokumentation )

Ich denke auch, dass deine Schleife so aussehen sollte:

foreach ($results as $result){
        $row = $results->current();
        $clients = $row->findDependentRowset('ORM_Post_Client','post'); 
  }

weil Sie nach Kunden für eine Stelle suchen, was bedeutet, dass diese Stelle Ihre rule

( $row->findDependentRowset($table, [$rule]); )

0voto

RockyFord Punkte 8519

So wie es dargestellt ist, wird es nicht funktionieren, ehrlich gesagt macht es keinen Sinn.

$post = new ORM_Post();
    $results = $post->fetchAll();

    foreach ($results as $key => $result){
        //$row is assigned to the whole fetchall result!
        $row = $results->current();
        //in this context $client cannot call a dependent rowset.
        $client = $row->findDependentRowset('ORM_Post_Client','client');
    }

MMc hat Recht, dass die Definition der Referenztabelle nicht korrekt war, aber Ihr Code hat auch einige Probleme. Versuchen Sie vielleicht etwas wie:

 $post = new ORM_Post();

    $results = $post->fetchAll();

    //unless your are going to use the 'key' for something you don't need it
    foreach ($results as $result){

        //you need each row object in order to call findDependentRowset in a one to many relationship.
        $row = $post->find($result->id)->current();
        //unless you have multiple rules set up for each table class pair you don't need to specify the rule.
        $client = $row->findDependentRowset('ORM_Post_Client');
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X