2012-03-28 12 views
2

ich innere machen wollen Verbindung zwischen zwei TabellenInner Join in Zend Framework

Besuch Tabelle hat

  • visit_id
  • Ziel

Bericht Tabelle hat

  • rep_id
  • visit_id

Jeder Besuch viele Berichte hat, möchte ich alle Berichte mit bestimmten Besuch Ziel

ich so wählen machen, aber es donesn't arbeiten

$db = Zend_Db_Table::getDefaultAdapter(); 
    $select = $db->select(); 

    $rows = $select->from('visits_tb', array('target', 'visit_id')) 
        ->joinInner('report_tb', 'visits_tb.visit_id= report_tb.visit_id', array('visit_id', 'rep_id')) 
        ->where("visits_tb.visit_id=$id"); 
+0

Wie funktioniert es nicht? 'echo $ select;' zeigt einen INNEREN JOIN oder nicht? – bububaba

+0

Es gibt eine Empy-Ergebnismenge zurück, selbst wenn ich SQL auf dem SQL-Server ausführe !! – palAlaa

Antwort

7

Sie können die versuchen, folgende; vielleicht ist es ein wenig klarer, wenn Sie Tabellen-Aliases verwenden:

$db = Zend_Db_Table::getDefaultAdapter(); 

$select = $db->select() 
->from(array('v' => 'visits_tb'), array('target', 'visit_id', 'rep_id')) 
->joinInner(array('r' => 'report_tb'), 'v.visit_id = r.visit_id') 
->where('v.visit_id = ?', $id); 

$query = $select->query(); 
1
$db = Zend_Db_Table::getDefaultAdapter(); 
     $select = $db->select(); 

    $select = $select->from('visits_tb', array('target', 'visit_id')) 
        ->joinUsing('report_tb', 'visit_id', 'rep_id') 
        ->where("visits_tb.visit_id=?",$id); 

ZF nutzt innere standardmäßig verbinden, so joinInner == beitreten. Da der Name FK = PK ist, können Sie joinUsing verwenden.

$rows = $db->fetchAll($select); 
0

denke ich bessere Lösung Zend Beziehung in diesem Fall

http://framework.zend.com/manual/en/zend.db.table.relationships.html

class Visit extends Zend_Db_Table_Abstract 
{ 
    protected $_name   = 'visit'; 
    protected $_primary   = 'visit_id'; 
} 

class Report extends Zend_Db_Table_Abstract 
{ 
    protected $_name   = 'report'; 
    protected $_primary   = 'rep_id'; 

    protected $_referenceMap = array(
     'Visit' => array(
     'columns'   => 'visit_id', 
     'refTableClass'  => 'Visit', 
     'refColumns'  => 'visit_id' 
    )) 
} 

Mit dieser Konfiguration verwenden sollten Sie in der Lage sein, abhängig rowset mit Berichten zu holen

$visitTable = new Visit(); 

//fetch visit with id 13 
$visitRow = $visitTable->find(13)->current(); 

$reportRowset = $visitRow->findDependentRowset('Report'); 

Was ist vorteilhaft? Sie können sofort weitermachen und das Ergebnis verarbeiten s

//for example 
foreach ($reportRowset as $report) { 
    $report->someField = 'newValue'; 

    $report->save(); 
} 
+0

Ich kann den Beitrittsprozess hier nicht verstehen! wie kann ich arbeiten, wenn ich Bedingungen für den referenzierten Schlüssel habe .. Dieser Weg ist überhaupt nicht einfach :( – palAlaa

+0

Es gibt keine Join in meiner Lösung. Sie arbeiten mit zwei unabhängigen Row-Objekte - $ reportRow und $ visitRow. Sie können sie manipulieren und speichern Sie ohne zusätzliche Arbeit.Wenn Sie Join verwenden, müssen Sie die Ergebnisse bearbeiten, bevor Sie etwas mit ihnen machen können. – vandalizmo

0

Was passiert, wenn Sie es andersherum drehen?

$rows = $select->from(array('r'=>'report_tb'), array('rep_id', 'visit_id')) 
       ->join(array('v'=>'visits_tb'), 'r.visit_id= v.visit_id', array('target')) 
       ->where("r.visit_id=$id"); 

Haben Sie den Code nicht getestet, aber sah korrektere ich meine Augen, wenn Sie die Ausgabe alle Zeilen aus dem Bericht Tabelle wollte, mit einem festgelegten Ziel.