Zend: Создание моделей для таблицы продуктов - PullRequest
5 голосов
/ 16 декабря 2009

Я пытаюсь создать две модели, products и product_manufacturers, чтобы я мог использовать производителей, а также продукты, редактировать их в админке, если необходимо, и обычные элементы CRUD. Вот схема для таблиц (она не завершена , поэтому, если у вас есть какие-либо предложения, продолжайте).

CREATE TABLE `product_manufacturers` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `manufacturer_name` varchar(100) default NULL,
  `active` tinyint(1) default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

CREATE TABLE `products` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `product_name` varchar(100) default NULL,
  `manufacturer_id` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

Пример данных:

(продукты) -

id product_name manufacturer_id
1  iPod Nano 4g 1

(product_manufacturers) -

id manufacturer_name active
1  Apple             1

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

protected function _initAutoload ()
{
    // Add autoloader empty namespace
    $autoLoader = Zend_Loader_Autoloader::getInstance();
$resourceLoader = new Zend_Loader_Autoloader_Resource(
    array(
    'basePath' => APPLICATION_PATH ,
    'namespace' => '' ,
    'resourceTypes' => array(
        'form' => array('path' => 'forms/' ,
        'namespace' => 'Form_') ,
        'model' => array('path' => 'models/' ,
        'namespace' => 'Model_')
    )
    ));
    // Return it so that it can be stored by the bootstrap
    return $autoLoader;
}

применение / модели / product.php:

<?php
require_once 'Zend/Db/Table/Abstract.php';

class Model_Product extends Zend_Db_Table_Abstract
{
    /**
     * The default table name 
     */
    protected $_name = 'products';
    protected $_dependentTables = array('Model_Manufacturer');
}

применение / модель / Manufacturer.php:

class Model_Manufacturer extends Zend_Db_Table_Abstract
{
    /**
     * The default table name 
     */
    protected $_name = 'product_manufacturers';
    protected $_referenceMap = array(
 'Model_Product' => array(
     'manufacturer_id' => array('id'),
     'id' => array('manufacturer_id'),
 ),
    );
}

У меня такое ощущение, что я все делаю неправильно, поскольку я создаю объект из Модели продуктов и пытаюсь распечатать все продукты, у которых есть соответствующий производитель, и этот производитель активен.

 $model = new Model_Product();
 $results = $model->fetchAll();
 foreach ($results as $result) {
     //print_r($result);
     echo $result->product_name;
 }

Я новичок в создании моделей. Может ли кто-нибудь дать совет, как правильно изменить текущий код, чтобы модель продуктов должным образом зависела от модели производителей?

У меня такое ощущение, что я неправильно устанавливаю зависимую таблицу / эталонную карту, и вместо использования общего метода fetchAll мне следует создать собственный метод в любой из моделей для выборки и, возможно, ручного соединения таблицу производителей, или правильное свойство referenceMap и variableTables решит эту проблему?

Ответы [ 2 ]

9 голосов
/ 16 декабря 2009

Здесь есть несколько вещей, которые нужно исправить, но вот несколько советов.

я. Настольные модели работают немного лучше, если их имена являются множественными. Они звучат лучше в волшебных методах (например, $ product_set = findProducts () вместо findModel_Product ())

II. Справочная карта является важной и позволяет работать этим изящным магическим методам выбора (например, findParentX ()). Он принадлежит к зависимой таблице, которая здесь является таблицей product, поскольку она ссылается на product_manufacturer.

  // in Model_Product
  protected $_referenceMap = array(

    // rule name
    'Manufacturer' => array(

      'columns'       => 'manufacturer_id',     // this column
      'refTableClass' => 'Model_Manufacturer',  // references that table object
      'refColumns'    => 'id'                   // and references that column
    )
  );



III. Переместите запись зависимых таблиц в модель таблицы product_manufacturers, если хотите: она используется только для репликации команд базы данных ON DELETE/UPDATE CASCADE. (Оставьте это сейчас)

// in manufacturer table model
protected $_dependentTables = array('Model_Product');



Fetching

Чтобы получить производителя продукта, сделайте следующее:

$manufacturer = $product_row->findParentManufacturer();


Чтобы получить продукцию производителя, сделайте это:

$product_set = $manufacturer_row->findProducts(); // Well, findModel_Product(), which is why you should rename your table ;)


Для других магических методов, происходящих из каждой строки, покопайтесь в исходном коде Zend_Db_Table_Row_Abstract (особенно public function __call).

0 голосов
/ 28 июля 2011

Я реализовал справочные карты и извлекаю родительские детали записи, используя метод $ childObject-> findParentObject (), который хорошо работает для отдельных экземпляров дочернего объекта.

однако у меня есть проблема с использованием этого для получения сведений о родительских объектах для нескольких дочерних строк [для целей отображения], что в настоящее время включает в себя выбор, чтобы получить начальный набор записей, а затем обойти это, используя findParentObject () способ получить то, что я хочу для этой записи. таким образом, я решил проигнорировать карту ссылок и сделать для этого соединение, полностью обходя карту ссылок. это работает нормально, только один выбор и быстрее.

Мой вопрос: есть ли хороший способ использования карты ссылок для достижения тех же результатов, используя один запрос? то, как я сейчас использую справочную карту, кажется немного надуманным, хотя для чистоты мне кажется, что я должен использовать его, чтобы делать то, что мне нужно ...

Роб Ганлы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...