2012-03-28 108 views
2

我想讓內兩個表內Zend框架中加入

之間的連接

訪問表有

  • visit_id
  • 目標

報告表有

  • rep_id
  • visit_id

每次訪問都有很多報道,我想選擇與指定的訪問目標

我作出這樣的所有報告,但它donesn't工作

$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

它不起作用? 'echo $ select;'顯示INNER JOIN或不顯示? – bububaba 2012-03-28 08:45:40

+0

即使我執行sql int sql服務器,它也會返回empy結果集! – palAlaa 2012-03-28 09:32:19

回答

7

你可以試試以下;也許它更清楚一點,如果你使用表別名:

$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默認使用內部連接,使joinInner ==加入。由於FK = PK的名稱,因此您可以使用joinUsing。

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

我認爲更好的辦法是使用Zend的關係,在這種情況下

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

有了這個配置,您應該能夠使用報告來獲取相關的行集

$visitTable = new Visit(); 

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

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

有什麼好處您可以立即進行並處理結果s

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

    $report->save(); 
} 
+0

我無法理解加入這裏的過程!我如何才能工作,如果我有條件的引用鍵..這種方式是不容易的:( – palAlaa 2012-03-29 12:29:30

+0

有沒有加入我的解決方案。你使用兩個獨立的Row對象 - $ reportRow和$ visitRow。你可以操縱它們並保存沒有額外的工作。使用連接時你需要先處理結果,然後你可以用它們做任何事情。 – vandalizmo 2012-03-30 12:15:48

0

如果你反其道而行,會發生什麼?

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

沒有測試的代碼,但看上去更正確的我我的眼睛,如果你想輸出報告表中的所有行,但指定的目標。