2 votes

Zend_Db_Table_Abstract Chargement des modèles joints

J'ai une table nommée :

client (id, alias) post (id, sujet) post_client (id, post_id, client_id)

Plusieurs clients peuvent être joints à un poste.

En utilisant Zend DB Table abstract j'ai commencé à construire un modèle, voici les classes :

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

    );
}

Ce que j'espérais faire, c'est appeler une instance du Post et charger les clients associés, ainsi que charger une instance du client et charger tous les Post associés.

Alors j'ai fait ça :

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

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

et j'obtiens La règle de référence "client" ne fait pas référence à la table ORM_Post.

Je me suis battu avec cela pendant des heures et je ne vois pas où je me trompe. Dois-je déclarer les jointures Post_Client à l'intérieur du modèle client et post également ?

EDIT

Voici ce que je cherchais :

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

Merci pour les conseils, vous m'avez mis sur la bonne voie.

3voto

Mouna Cheikhna Points 12741

Dans votre ORM_Post_Client il devrait l'être

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

refTableClass => Le nom de la classe de la table parente. Utilisez le nom de la classe et non le nom physique de la table SQL ( documentation )

Je pense aussi que votre boucle devrait être :

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

parce que vous recherchez les clients d'un poste, ce qui signifie que ce poste est le vôtre. rule

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

0voto

RockyFord Points 8509

Tel que présenté, cela ne fonctionnera pas, honnêtement, cela n'a aucun sens.

$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 a raison en ce sens que la définition de votre table de référence était incorrecte, mais votre code a également quelques problèmes. Essayez peut-être quelque chose comme :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X