2009-09-21 1 views
4

Я новичок в zend. Меня попросили переделать веб-сайт, который когда-то был написан простым PHP, и поместить его в среду zend.zend отношения с выбором

У меня возникли проблемы с отношениями с базой данных, я, похоже, не знаю, как определить и запросить отношения.

Я хотел бы найти категорию. Из этой категории я хотел бы найти всю связанную с ним Категоризацию и иметь возможность запрашивать/сортировать/ограничивать этот набор данных.

Вот мои модели.

Categorys.php

<?php 
    class Default_Model_Categorys extends Zend_Db_Table_Abstract 
    { 
     protected $_name = 'Categorys'; 
     protected $_primary = 'id'; 

     protected $_dependentTables = array('Default_Model_CategoryInfo'); 
} 
?> 

CategoryInfo.php

<?php 
class Default_Model_CategoryInfo extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'Category_Info'; 
    protected $_primary = 'id'; 

    protected $_referenceMap = array(
     'Categorys' => array(
      'columns' => array('cat_id'), 
      'refTableClass' => 'Default_Model_Categorys', 
      'refColumns' => array('id') 
     ) 
    ); 
} 
?> 

CategoryController.php

<?php 
    class CategorysController extends Zend_Controller_Action 
    { 
     public function indexAction() 
     { 
     /* 
      this should redirect to all games 
     */ 
      return $this->_forward("index", "games"); 
     } 

     public function categoryAction() 
     { 
      /* 
      shows a specific category 
      */ 
      $id = (int) $this->_request->getParam('id'); 
      $category = new Default_Model_Categorys(); 
      $this->view->category = $category->fetchRow(
       $category->select()->where('id = ?', $id) 
     ); 

      $categoryInfo = $this->view->category->findDependentRowset('Default_Model_CategoryInfo'); 

     } 
    } 

Во-первых ... я делаю что-то неправильно?

Во-вторых ... как мне обратиться к зависимому набору строк?

ответ

2

Во-первых, если вы ищете категории по ее первичного ключа, то проще использовать find() метод:

$id = (int) $this->_request->getParam('id'); 
$category = new Default_Model_Categorys(); 
$this->view->category = $category->find($id)->current(); 

Во-вторых, ограничить или рода зависимые Category_Info строки, вы можете использовать Zend_Db_Table_Select объект как необязательный параметр findDependentRowset(). Вот пример:

$select = $category->select()->where("info_type = 'PRICE'") 
          ->order("info_date") 
          ->limit(3); 
$categoryInfo = $this->view->category->findDependentRowset(
    'Default_Model_CategoryInfo', null, $select); 

Обратите внимание, что вы можете использовать любой объект таблицы для создания этого объекта-объекта. Поскольку «FROM» пункт для этого выберите будет установлен методом findDependentRowset(), вы просто добавить другие пункты, а затем передать его в

PS:. Вам не нужно объявлять $_dependentTables вообще, если вы не собираетесь использовать каскадное обновление или каскадное удаление через PHP-код. Я настоятельно рекомендую против, делая это - гораздо эффективнее позволить RDBMS обрабатывать эти каскадные операции.

Аналогичным образом вам не нужно будет объявлять $_primary, если ваши таблицы базы данных фактически объявляют ограничения первичного ключа. Zend_Db_Table_Abstract знает, как проверить метаданные, чтобы получить столбцы первичного ключа.

+0

Билл вы, герой. Я благодарю тебя! Задача решена. – sfusion

+0

Рад помочь! Я отредактировал выше, чтобы добавить вызов 'current()', потому что 'find()' всегда возвращает набор строк, а не одну строку. –

0

Все выглядит правильно для меня. Вы не запрашиваете зависимый набор строк. Это сам запрос, и он возвращает набор результатов. В основном то, что он делает, это тянуть все записи, связанные с текущей строкой, с которой вы работаете, как определено $ _referenceMap. После того, как вы выполните findDependentRowset(), вы можете просмотреть результаты, которые приведут вам примеры Zend_Db_Table_Row. Оттуда вы можете отобразить соответствующие данные по мере необходимости.

Лично я не использую отношения Zend_Db. Гораздо проще просто сделать второй модельный метод для запроса того, что мне нужно. Кроме того, отношения Zend_Db не поддерживают , где, поэтому просто сделать второй запрос гораздо более гибким, чем отношения.

 Смежные вопросы

  • Нет связанных вопросов^_^