Question

Je travaille sur une application développée avec Zend Framework. J'ai défini des relations dans des modèles et je peux les utiliser avec plaisir, par exemple:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

Cependant, un problème survient: l'ensemble de lignes renvoyé a des noms de colonne identiques dans "Personnes" et "Travaux". Par conséquent, les clés de tableau sont fusionnées, ce qui entraîne la perte de certaines données du dernier ensemble de lignes.

Je comprends que je peux transmettre un objet Zend_Db_Select à findManyToManyRowset () en tant que paramètre, mais je ne trouve aucune documentation expliquant comment l'utiliser dans ce cas. , par exemple:

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

Si j'essaie d'utiliser le code ci-dessus, je reçois un message tel que:

Error: No reference rule "" from table People to table Jobs

Quelqu'un peut-il m'expliquer comment procéder? Je sais que je pourrais changer les noms de colonne dans la base de données, mais je préférerais un changement de code plutôt que de repenser ma structure de base de données et de mettre à jour tout le code associé.

Remarque: sans forme de pseudonyme de colonne comme ci-dessus, l'ensemble de lignes renvoyé a l'aspect suivant (c'est-à-dire qu'il fusionne les colonnes portant le même nom):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

À la vôtre,
  Matt

Était-ce utile?

La solution

Ma première recommandation est de ne pas nommer les colonnes avec des noms génériques tels que id et code . Ces noms n'ont pas de sens et, comme vous l'avez découvert, ils provoquent également des collisions lorsque vous récupérez les résultats dans un tableau associatif.

Vous n'utilisez pas non plus correctement l'interface de sélection. Vous ne devez spécifier qu'une table par appel from () ou join () .

Enfin, je n’essaye jamais de faire des requêtes complexes via l’interface de relations Zend_Db_Table . Il est destiné uniquement à des cas simples. Si vous avez une requête plus complexe, écrivez simplement la requête SQL.

Voir aussi Comment faire une requête jointe dans l'interface des tables ZF?

Autres conseils

Je sais que cette réponse arrive un peu tard, mais voici quelques points à souligner.

1) findManyToManyRowset ($ matchTable, $ intersectionTable, $ callerRefRule, $ matchRefRule, $ select); - si vous passez un Zend_Db_Table_Select , vous allez vouloir passer null pour les règles.

2) Le Zend_Db_Table_Select passé dans le findManyToManyRowset () doit être créé à partir de $ matchTable et il est prudent de supposer que, dans l'emplacement où clauses i est l'alias de la table d'intersection et m est l'alias de la table de correspondance.

3) En cas de collision, m gagnera le nom de la clé dans le tableau associatif renvoyé dans php. La requête exécutée ressemble à ceci:

  SELECT 
    `i`.*, `m`.* 
  FROM 
    `interscetTable` AS `i` 
  INNER JOIN 
    `matchTable` AS `m` 
  ON
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)  

4) Quoi qu’il en soit, la valeur renvoyée par findManyToManyRowset () sera un ensemble de lignes créé à partir de $ matchTable . Par conséquent, si vous devez capturer des informations de la intersection de la table, tout en capturant les données pour la table de correspondance, vous aurez probablement besoin d’un Zend_Db_Select personnalisé et évitez d’utiliser le Zend_Db_Table pour mapper les données de toute façon.

C’est donc un exemple concret, qui utilise "Personnes". comme table de correspondance, " Travailleurs " comme table d’intersection et disons "Clients". en tant que table d'origine. En supposant pour cet exemple que les tables lient entre elles quelque chose comme:  Personnes. id: ... - > travailleurs. id_personne: id_client: id_travail - > clients: id: ...

$client = $clientTable->fetchRow(); /// grab a random client

// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('i.hiredate')); 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top