Zend框架中的内部联接

时间:2012-03-28 08:25:19

标签: sql zend-framework inner-join

我想在两个表之间进行内连接

访问表已

  • visit_id

报告表有

  • rep_id
  • visit_id

每次访问都有很多报告,我想选择具有指定访问目标的所有报告

我这样做,但它没有用

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

4 个答案:

答案 0 :(得分: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 :(得分: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 == join。由于FK = PK的名称,因此您可以使用joinUsing。

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

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

什么是有益的你可以立即继续处理结果

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

   $report->save();
}

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

没有测试过代码,但是如果你想输出报告表中指定目标的所有行,我的眼睛看起来更正确。