Zend:为产品表创建模型

时间:2009-12-16 02:32:58

标签: php mysql zend-framework

我正在尝试创建两个模型,productsproduct_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;
 }

我是模特创作的新手,是否有人可以提供有关如何正确更改当前代码的建议,以便产品模型能够正确依赖制造商模型?

我有一种感觉,我不正确地设置dependentTables / referenceMap,而不是使用通用fetchAll方法,我应该在任一模型中创建一个自定义方法来进行提取,也许是手动加入manufacturer表,或者是否正确的referenceMap和dependentTables属性可以解决这个问题?

2 个答案:

答案 0 :(得分:9)

这里有一些问题需要解决,但这里有一些提示。

我。如果名称复数,表格模型的效果会更好一些。它们在魔术方法中听起来更好(例如$ 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');



撷取

要获得产品制造商,请执行以下操作:

$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)。

答案 1 :(得分:0)

我已经实现了引用映射,并且我正在使用$ childObject-&gt; findParentObject()方法检索父记录的详细信息 - 这对于子对象的单个实例很有效。

但是我有一个问题,使用它来检索多个子行的父对象的细节[用于显示目的],当前涉及执行选择以检索初始记录集然后遍历此,使用findParentObject()获得我想要的记录的方法。因此我决定忽略参考地图并为此进行连接,完全绕过参考地图。这个工作正常,只有一个选择,而且更快。

我的问题是,使用一个查询是否有一种使用参考图来获得相同结果的好方法?我目前使用参考地图的方式感觉有点做作,虽然感觉就像纯度我应该用它来做我需要的......

rob ganly