Sql Zend框架中的内部连接

Sql Zend框架中的内部连接,sql,zend-framework,inner-join,Sql,Zend Framework,Inner Join,我想在两个表之间进行内部联接 访问表已关闭 访问id 目标 报告表已被删除 代表id 访问id 每次访问都有许多报告,我想选择具有指定访问目标的所有报告 我这样做,但不起作用 $db = Zend_Db_Table::getDefaultAdapter(); $select = $db->select(); $rows = $select->from('visits_tb', array('target', 'visit_id'))

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

访问表已关闭

  • 访问id
  • 目标
报告表已被删除

  • 代表id
  • 访问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");

你可以尝试以下方法;如果使用表别名,可能会更清楚一些:

$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();
默认情况下,ZF使用内部联接,因此joinInner==join。因为FK的名称=PK,所以您可以使用joinUsing

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

我认为更好的解决办法是在这种情况下使用Zend的关系

使用此配置,您应该能够获取带有报告的依赖行集

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

如果你把它转过来会怎么样

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

没有测试过代码,但在我看来更正确,如果您想以指定的目标输出报表表中的所有行。

它怎么不起作用<代码>echo$select是否显示内部联接?即使在sql server中执行sql,它也会返回empy结果集!!我不明白加入这里的过程!如果我有引用密钥的条件,我如何工作。。这样做一点也不容易:(我的解决方案中没有连接。您使用两个独立的行对象-$reportRow和$visitRow。您可以操作它们并保存,而无需额外工作。使用连接时,您需要先处理结果,然后才能使用它们。
//for example
foreach ($reportRowset as $report) {
   $report->someField = 'newValue';

   $report->save();
}
$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");