当前位置:  开发笔记 > 编程语言 > 正文

Zend:为产品表创建模型

如何解决《Zend:为产品表创建模型》经验,为你挑选了1个好方法。

我试图创建两种型号,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:



应用程序/模型/ 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方法我应该在任何一个模型中创建一个自定义方法来进行提取,也许是与制造商表的手动连接,或者一个合适的referenceMap和dependentTables属性解决了这个问题?



1> Derek Illchu..:

这里有一些事情需要解决,但这里有一些提示.

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

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有