Magento的CRUD模型具有三种基本类类型。
“模型”是您最常使用的模型。这以数据库不可知的方式表示特定类型的数据(产品,类别,CMS页面,审阅等)。
“资源模型”是一个在后台执行从Magento实际获取数据的类。每个模型都有一个资源模型,用于加载模型的单个实例从数据库中。
“集合”是一个类,它基于一组规则加载类似于多个模型的结构的数组。将其视为SQLWHERE clause
。
令人有些困惑的是,Magento在后台还认为集合是一种资源模型。因此,有收集资源模型和单个资源模型。
一般来说,当您要加载特定项目时,可以使用模型。当您要加载许多项目时,可以使用集合资源模型。
//loads one
$product = Mage::getModel('catalog/product')->load($id);
//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));
foreach($products as $product)
{
var_dump($product->getSku());
}
通过集合资源模型加载时要记住的一件事是每个单独模型的 afterLoad
不会自动调用方法,这意味着可能不会加载某些数据。
该individua资源模型类通常不直接访问。但是,有时特定的模型会有资源带有有用方法模型。您会随着时间的推移使用系统发现这些内容。
最后,还有一个区别。Magento的常规CRUD模型具有特殊的语法,可通过非数字ID的内容进行加载。例如,以下是按标题加载CMS页面模型的方法
$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());
但是,一些Magento模型是EAV模型。这代表“实体属性值”,是一种说法,这些模型没有固定的字段集。这包括产品模型和类别模型。此功能使您可以为不同类型的产品选择不同的属性。EAV模型上的每个字段都称为属性。上面的语法不适用于这些模型,而是需要使用loadByAttribute
方法。
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');
关于您的特定问题,如果在输入特定文本“方法未定义”时遇到错误,则您的系统出了点问题。即使该getSku
方法不存在,Magento仍具有魔术设置器和获取器方法,可确保get
在任何模型上的调用始终返回某些内容,即使它为null。
您更有可能遇到如下错误
Call to a member function getSku() on a non-object
发生此错误是因为如果无法加载该对象,该loadByAttribute
方法将返回false
。
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false
在您的代码中尝试类似的事情。
$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
var_dump($product->getName());
var_dump($product->getSku());
var_dump($product->getData());
}
else
{
var_dump("Could not load product");
}
除条件外,请注意该getData()
方法。这将以对象的形式返回所有对象数据的数组。
希望这足以让您感动。祝好运!
$product
在您的示例中,是的实例Mage_Catalog_Model_Product
,这是Magento的“模型”。