Domanda

Sto lavorando ad un'applicazione sviluppata usando Zend Framework. Ho definito le relazioni nei modelli e posso usarle felicemente, ad esempio:

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

Tuttavia, ho riscontrato un problema in cui il set di righe viene restituito con nomi di colonna uguali in "Persone" e "Lavori" e, pertanto, unisce le chiavi dell'array, perdendo alcuni dei dati dal set di righe finale.

Comprendo di poter passare un oggetto Zend_Db_Select a findManyToManyRowset () come uno dei parametri, ma non riesco a trovare alcuna documentazione che spieghi come usarlo in questo caso , ad esempio:

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

Se provo ad usare il codice sopra, ricevo un messaggio come:

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

Qualcuno può illuminarmi su come dovrebbe essere fatto? So che potrei cambiare i nomi delle mie colonne nel database, ma preferirei una modifica del codice piuttosto che riprogettare la mia struttura DB e aggiornare tutto il codice correlato.

Nota: senza una qualche forma di aliasing di colonna come sopra, il set di righe restituito è simile al seguente (cioè, unisce le colonne con gli stessi nomi):

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

Saluti,
  Matt

È stato utile?

Soluzione

La mia prima raccomandazione è di non nominare colonne come nomi generici come id e code . Questi nomi non hanno senso e, come hai scoperto, provocano anche collisioni quando recuperi i risultati in una matrice associativa.

Stai anche usando l'interfaccia Select in modo errato. È necessario specificare una sola tabella per da () call o join () call

Infine, non provo mai a fare query complesse tramite l'interfaccia di relazioni Zend_Db_Table . È destinato solo a casi semplici. Se hai una query più complessa, scrivi esplicitamente la query SQL.

Vedi anche Come fare una query unita nell'interfaccia delle tabelle ZF?

Altri suggerimenti

So che questa risposta arriva un po 'in ritardo, ma qui ci sono alcune cose da sottolineare.

1) findManyToManyRowset ($ matchTable, $ intersectionTable, $ callerRefRule, $ matchRefRule, $ select); - se stai passando un Zend_Db_Table_Select che vorrai passare null per le regole.

2) Il Zend_Db_Table_Select passato nel findManyToManyRowset () dovrebbe essere creato da $ matchTable ed è sicuro supporre che nel dove le clausole i è l'alias per la tabella di intersezione e m è l'alias per la tabella di corrispondenza.

3) In caso di collisioni, m vincerà il nome della chiave nella matrice associativa restituita in php. La query eseguita è simile al seguente:

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

4) Indipendentemente da ciò, il valore di ritorno di findManyToManyRowset () sarà un Rowset creato da $ matchTable , quindi, se è necessario acquisire informazioni dal tabella intersecante, pur acquisendo anche i dati per la tabella delle corrispondenze, probabilmente dovrai avere un Zend_Db_Select personalizzato ed evitare di usare il Zend_Db_Table per mappare comunque i dati.

Quindi un esempio funzionante, usando " People " come tabella delle corrispondenze, "Lavoratori" come tabella di intersezione e diciamo " Clienti " come tabella di origine. Supponendo per questo esempio che le tabelle colleghino qualcosa del tipo:  Persone. id: ... - > lavoratori. person_id: client_id: job_id - > clienti: 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')); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top