代码之家  ›  专栏  ›  技术社区  ›  meder omuraliev

Zend:为产品表创建模型

  •  5
  • meder omuraliev  · 技术社区  · 15 年前

    我正在尝试创建两个模型, products product_manufacturers 这样我就可以引进制造商和产品,在必要的时候在管理员中编辑它们,以及常见的积垢。这是表的模式(不是 定稿 所以如果你有什么建议,那就去吧。

    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
    

    (产品制造商)

    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');
    }
    

    应用程序/模型/制造商.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属性可以解决这个问题吗?

    2 回复  |  直到 13 年前
        1
  •  9
  •   Derek Illchuk    15 年前

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

    i.如果表模型的名称是复数形式,那么它的工作会更好一些。它们在魔力方法中听起来更好(例如$product_set=findproducts()而不是findmodel_product())

    二。参考图是一个重要的图,允许那些漂亮的魔法选择方法(例如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 )

        2
  •  0
  •   Rob Ganly    13 年前

    我已经实现了引用映射,并且正在使用$childObject->findparentObject()方法检索父级记录的详细信息,该方法对于子对象的单个实例非常有效。

    但是,我在使用它为多个子行(用于显示目的)检索父对象的详细信息时遇到了一个问题,它当前涉及到执行一个选择来检索初始记录集,然后使用findparentobject()方法来获取该记录的所需内容。因此,我决定忽略引用映射并为此进行联接,完全绕过引用映射。这很好用,只是一个选择,而且速度更快。

    那么,我的问题是,有没有一种很好的方法可以使用引用映射来实现相同的结果,即使用一个查询?我目前使用参考地图的方式有点做作,尽管出于纯粹的考虑,我应该使用它来做我需要的事情…

    罗布甘利