Zend框架表关系 - 从应用程序中的多个表中选择

时间:2012-04-10 20:57:46

标签: zend-framework zend-db zend-db-table

我希望我能以一种可以理解的方式提出这个问题。我一直在研究一个处理1个表(jobschedule)的应用程序。所以,我有模型/ Jobschedule.php,models / JobscheduleMapper.php,controllers / JobscheduleController.php,view / scripts / jobschedule / * .phtml文件

所以在我的控制器中我会做这样的事情:

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

然后在我的映射器中我做了类似的事情:

        $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映射器和控制器?如果是这样,那就完成了...我只是不知道如何一次操纵两个表并得到我需要的记录。那把代码放在我的控制器里?

2 个答案:

答案 0 :(得分: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)禁用表之间的引用完整性,这只有在您写入时才重要。对于像这样的查询,你可以禁用它并继续前进(否则它会引发异常)。

答案 1 :(得分: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);

如果您正在寻找,请告诉我们。