我正在尝试创建两个模型,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;
}
我是模特创作的新手,是否有人可以提供有关如何正确更改当前代码的建议,以便产品模型能够正确依赖制造商模型?
我有一种感觉,我不正确地设置dependentTables / referenceMap,而不是使用通用fetchAll
方法,我应该在任一模型中创建一个自定义方法来进行提取,也许是手动加入manufacturer表,或者是否正确的referenceMap和dependentTables属性可以解决这个问题?
答案 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