Frage

Ich arbeite an einer Anwendung, die mit Zend Framework entwickelt wurde.Ich habe Beziehungen in Modellen definiert und kann sie gerne verwenden, z. B.:

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

Ich bin jedoch auf ein Problem gestoßen, bei dem das zurückgegebene Rowset die gleichen Spaltennamen in „People“ und „Jobs“ hat und daher die Array-Schlüssel zusammenführt, wodurch einige Daten aus dem endgültigen Rowset verloren gehen.

Ich verstehe, dass ich eine bestehen kann Zend_Db_Select widersprechen findManyToManyRowset() als einen der Parameter, kann aber keine Dokumentation finden, die erklärt, wie man ihn in diesem Fall verwendet, z. B.:

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

Wenn ich versuche, den obigen Code zu verwenden, erhalte ich eine Meldung wie:

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

Kann mir jemand erklären, wie das gemacht werden sollte?Ich weiß, dass ich meine Spaltennamen in der Datenbank ändern könnte, aber ich würde eine Codeänderung vorziehen, anstatt meine DB-Struktur neu zu entwerfen und den gesamten zugehörigen Code zu aktualisieren.

Notiz:Ohne irgendeine Form von Spalten-Aliasing wie oben sieht das zurückgegebene Rowset wie folgt aus (d. h. es führt die Spalten mit denselben Namen zusammen):

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

Prost,
Matt

War es hilfreich?

Lösung

Meine erste Empfehlung ist, dass Sie nicht Spalten solche generischen Namen wie id und code nennen sollten. Diese Namen sind bedeutungslos, und wie Sie entdeckt haben, sie auch zu Kollisionen, wenn Sie die Ergebnisse in einem assoziativen Array holen.

Sie verwenden auch die Select-Schnittstelle falsch. Sie sollten nur eine Tabelle pro from() Anruf oder join() Anruf angeben.

Schließlich versuche ich nie komplexe Abfragen über die Zend_Db_Table Beziehungen Schnittstelle zu tun. Es ist beabsichtigt, nur für einfache Fälle. Wenn Sie eine komplexere Frage haben, schreiben Sie einfach die SQL-Abfrage explizit.

Siehe auch Wie zu tun, um eine Join-Abfrage in der ZF-Tabellen-Schnittstelle?

Andere Tipps

Ich weiß, dass diese Antwort etwas spät kommt, aber hier sind einige Dinge, auf die ich hinweisen sollte.

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); -- wenn Sie an einer vorbeikommen Zend_Db_Table_Select Du wirst bestehen wollen null für die Regeln.

2) Die Zend_Db_Table_Select in die übergegangen findManyToManyRowset() sollte daraus erstellt werden $matchTable und man kann mit Sicherheit davon ausgehen, dass dies in den where-Klauseln der Fall ist i ist der Alias ​​für die Schnittpunkttabelle und m ist der Alias ​​für die Match-Tabelle.

3) Bei Kollisionen m gewinnt den Schlüsselnamen im assoziativen Array, das in PHP zurückgegeben wird.Die ausgeführte Abfrage sieht folgendermaßen aus:

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

4) Egal was, der Rückgabewert von findManyToManyRowset() wird ein Rowset sein, das aus dem erstellt wird $matchTable Wenn Sie also Informationen aus der Schnitttabelle erfassen und gleichzeitig die Daten für die Vergleichstabelle erfassen müssen, benötigen Sie wahrscheinlich eine benutzerdefinierte Tabelle Zend_Db_Select und vermeiden Sie die Verwendung von Zend_Db_Table Zeug, um die Daten sowieso abzubilden.

Also ein funktionierendes Beispiel, bei dem „Personen“ als Übereinstimmungstabelle, „Arbeiter“ als Schnittpunkttabelle und beispielsweise „Kunden“ als Ursprungstabelle verwendet werden.Nehmen wir für dieses Beispiel an, dass die Tabellen etwa wie folgt miteinander verknüpft sind:Menschen.id:... -> Arbeiter.person_id:client_id:job_id -> Kunden: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')); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top