【问题标题】:Zend Framework Table Relationships - select from multiple tables within appZend Framework 表关系 - 从应用程序内的多个表中选择
【发布时间】:2023-03-12 17:35:02
【问题描述】:

我希望我以一种可以理解的方式提出这个问题。我一直在开发一个处理 1 个表 (jobschedule) 的应用程序。所以,我有models/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;
    }

然后在我看来,我可以操纵 $entries。好吧,我现在遇到的问题是还有另一个名为“jobindex”的表,其中有一个名为“jobno”的列。 'jobno' 列与 'jobschedule' 表中的 'jobnum' 列保持相同的记录。我需要在“jobindex”表中找到“store_type”列的值,其中jobindex.jobno = joschedule.jobnum(例如,1234 是jobno/jobnum)。有人可以在这里帮助我吗?我需要创建一个 jobindex 映射器和控制器吗?如果是这样,那就完成了......我只是不知道如何同时操作两个表并获取我需要的记录。以及将该代码放在哪里...在我的控制器中?

【问题讨论】:

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


    【解决方案1】:

    如果我理解正确,这是从数据库中提取数据所需的 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);
    

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

    【讨论】:

      【解决方案2】:

      如果我对您的理解正确,您需要将“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) 禁用表之间的引用完整性,这仅在您向它们写入时才重要。对于像这样的查询,您可以禁用它并继续(否则它会抛出异常)。

      【讨论】:

      • 我会尽快尝试。非常感谢您的帮助,请继续关注。
      • 我觉得我自己真的很困惑。我将再次尝试解释,看看你是否想出一些不同的东西。 Jobschedule 中有一个名为 jobnum 的列,而 jobindex 表中有一个名为 jobno 的列。这些中的每一个都具有相同的值。 jobindex 表还有一个名为 store_type 的行。我想找到 jobno 和 jobnum 匹配 AND store_type == 我在我的 POST 中传递的一些参数的所有记录。因此,如果 ?store_type=WM,我想在页面上显示来自jobindex 表的store_type 等于WM 的jobschedule 表中的所有记录,并且该记录的jobno = jobnum 来自jobschedule
      • 我试图尽可能具体并有意义。如果你们需要我更好地解释,我会的......这已经让我发疯了几天。
      • 好的,我想你只需要添加另一个 where() 来过滤 store_type。我将在上面编辑我的答案。
      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多