我试图创建两种型号,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:
应用程序/模型/ 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
).