Внутреннее соединение в Zend Framework - PullRequest
2 голосов
/ 28 марта 2012

Я хочу сделать внутреннее соединение между двумя таблицами

Таблица посещений имеет

  • visit_id
  • target

Таблица отчетов содержит

  • 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 ]

7 голосов
/ 28 марта 2012

Вы можете попробовать следующее; может быть, немного понятнее, если вы используете псевдонимы таблиц:

$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 голос
/ 28 марта 2012
    $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);
0 голосов
/ 28 марта 2012

Что произойдет, если вы перевернете его наоборот?

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

Я не проверял код, но выглядел более корректным, если вы хотите вывести все строки из таблицы отчета суказанная цель.

0 голосов
/ 28 марта 2012

Я думаю, что лучшее решение - использовать отношения 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...