Zend отношения с избранным - PullRequest
4 голосов
/ 21 сентября 2009

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

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

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

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

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 ]

1 голос
/ 22 сентября 2009

Во-первых, если вы ищете категорию по ее первичному ключу, проще использовать метод 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. Я настоятельно рекомендую против сделать это - гораздо эффективнее позволить СУБД обрабатывать эти каскадные операции.

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

0 голосов
/ 22 сентября 2009

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

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

...