2012-04-10 36 views
0

我希望我要求以簡單易懂的方式這個問題中從多個表中選擇。我一直在研究一個處理1個表(jobschedule)的應用程序。所以,我有型號/ Jobschedule.php,型號/ JobscheduleMapper.php,控制器/ JobscheduleController.php,查看/腳本/ jobschedule/* PHTML文件Zend框架表關係 - 應用

所以在我的控制,我會做這樣的事情:

$jobnumber = $jobschedule->getJobnum(); 
    $jobtype = $jobschedule->getJobtype(); 

    $table = $this->getDbTable(); 

public function listAction() 
{ 
    $this->_helper->layout->disableLayout(); 
    $this->view->jobnum = $this->getRequest()->getParam('jobnum', false); 
    $this->view->items = array();  

    $jobschedule = new Application_Model_Jobschedule(); 
    $jobschedule->setJobnum($this->view->jobnum); 

    $mapper = new Application_Model_JobscheduleMapper(); 
    $this->view->entries = $mapper->fetchAll ($jobschedule); 
} 

,然後在我的映射器II做這樣的事情:

 $resultSet = $table->fetchAll($table->select()->where('jobnum = ?', $jobnumber)->where('jobtype = ?', $jobtype)); 
     $entries = array(); 
     foreach ($resultSet as $row) { 
      $entry = new Application_Model_Jobschedule(); 
      $entry->setJobnum($row->jobnum) 
        ->setJobtype($row->jobtype) 
        ->setJobdesc($row->jobdesc) 
        ->setJobstart($row->jobstart) 
        ->setJobend($row->jobend) 
        ->setJobfinished($row->jobfinished) 
        ->setJobnotes($row->jobnotes) 
        ->setJobid($row->jobid); 
      $entries[] = $entry; 
     } 
     return $entries; 
    } 

然後在我看來,我可以操控$條目。那麼,我現在遇到的問題是,還有另一個名爲'jobindex'的表,其中有一個名爲'jobno'的列。 'jobno'列與'jobschedule'表中的'jobnum'列保持相同的記錄。我需要在'jobindex'表中找到'store_type'列的值,其中jobindex.jobno = joschedule.jobnum(例如1234是jobno/jobnum)。有人可以幫我嗎?我是否需要創建一個jobindex映射器和控制器?如果是這樣,那就完成了......我只是不知道如何一次處理兩個表並獲得我需要的記錄。並在哪裏把代碼...在我的控制器?

回答

0

如果我正確認識你,你會想加入「jobindex」表的「jobschedule」表。

... 
$resultSet = $table->fetchAll(
    $table->select()->setIntegrityCheck(false) 
     ->from($table, array('*')) 
     ->joinLeft(
      'jobindex', 
      'jobindex.jobno = jobschedule.jobnumber', 
      array('store_type')) 
     ->where('jobnum = ?', $jobnumber) 
     ->where('jobtype = ?', $jobtype) 
     ->where('jobindex.store_type = ?', $_POST['store_num']) 
); 
.... 

取決於如何 'jobschedule' 是關係到 'jobindex',你可能需要一個內部聯接(joinInner())來代替。

setIntegrityCheck(false)禁用表,如果你正在寫他們這是唯一重要的之間的參照完整性。對於像這樣的查詢,你可以禁用它並繼續前進(否則它會拋出異常)。

+0

我會盡快嘗試。非常感謝您的幫助,敬請關注。 – 2012-04-11 01:45:14

+0

我想我真的很困惑自己。我要再試一次解釋,看看你是否想出了不同的東西。 jobschedule在其中有一個名爲jobnum的列,jobindex表有一個名爲jobno的列。這些中的每一個都保持相同的值。 jobindex表也有一個名爲store_type的行。我想找到jobno和jobnum匹配的所有記錄AND store_type ==一些參數,我通過我的POST。所以,如果?store_type = WM,我想在頁面上顯示從jobschedule表,其中來自jobindex表store_type等於WM和所有記錄中記錄的jobno = jobnum從jobschedule – 2012-04-11 02:59:44

+0

我想是儘可能具體,使感。如果你們需要我更好地解釋我會......這讓我堅持了幾天。 – 2012-04-11 03:00:33

0

如果我理解你正確的,這是你需要從數據庫中提取數據的SQL查詢:

SELECT `jobschedule`.* FROM `jobschedule` INNER JOIN `jobindex` ON jobindex.jobno = jobschedule.jobnum WHERE (jobindex.jobtype = 'WM') 

組裝的Zend這個SQL查詢將是這個樣子:

$select->from('jobschedule', array('*')) 
    ->joinInner(
     'jobindex', 
     'jobindex.jobno = jobschedule.jobnum', 
     array()) 
    ->where('jobindex.jobtype = ?', $jobtype); 

設我們知道這是你在找什麼。