关于收集模型和资源模型


29

我对使用资源模型和集合模型感到困惑。有时,当我看到使用特定属性加载产品的示例时,在某些示例中,它们使用集合模型,有时使用资源模型。

另外,什么时候可以使用特定方法get...以及set...表行名称?喜欢getNamegetId。我尝试使用但无法获取值,并且显示错误:“在对象中调用未定义的方法”

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

它显示“未定义的方法getSku()

如果使用var_dump($product),则SKU显示在对象中,但是无法使用getSku()... 获取SKU 。


清楚一点- $product在您的示例中,是的实例Mage_Catalog_Model_Product,这是Magento的“模型”。
benmarks 2013年

是的,对。但是我很困惑何时使用收集模型和资源模型以及可以使用哪些方法。正如我所见,该模块的Model >> collection文件夹中提供了收集模型,资源模型中的资源可用,但是何时需要使用哪种模型,因此我
对此

我知道,我们也需要使用集合和外包中可用的可用方法。但是我很难找到使用正确的模型。而且我也无法使用“ Get”方法从结果集中获取结果,这意味着使用数据库表行名称的getName()。它显示了对象中未定义的方法,这意味着我正在访问错误的模型或需要使用的方法,因此我对需要使用的模型不满意。
MagentoBoy 2013年

1
感谢您提出这个问题。.我一直在寻找这个问题的答案.. +1 ..
Elavarasan 2014年

Answers:


63

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()方法。这将以对象的形式返回所有对象数据的数组。

希望这足以让您感动。祝好运!


@Alan ..非常好的描述...我已经阅读了您在Magento上的许多帖子:) ..在看到您对我的帖子的回复后,我感到非常高兴。我将继续提供您的信息。如果我有任何问题,希望我能得到这个社区的支持。由于我是magento和制图的新手,所以我的问题可能不是概念性的,但我仍然想学习。我真的很喜欢magento框架:) ..谢谢您,先生:)
MagentoBoy 2013年

对不起,我还有一个问题。如果我调用$ product = Mage :: getModel('catalog / product'); 然后如果我调用getName()和getSku()。如果我在foreachloop中迭代$ product,是否可以获得值?还是我必须调用loadByAttribute()方法?
MagentoBoy 2013年

@MagentoBoy,我很抱歉,但是语言障碍似乎掩盖了您的问题。我不确定你在问什么。
艾伦·斯托姆

先生,对不起 激动的是我没有清楚地表达我的问题。但是我尝试过,现在我可以获取产品列表,并且现在可以使用其他属性正确地获取产品。:)是的,我的问题是,可以使用诸如getName(),getPrice(),getSku()之类的get方法,而无需调用addAttributeToSelect('*'),addAttributeToFilter()或loadByAttribute();)。对于前。$ product = Mage :: getModel('catalog / product'); foreach($ product as $ p){echo $ p-> getName()。“”。$ p-> getSku();} ...由于get模型将实例化产品类,因此我们可以访问get和set方法。
MagentoBoy 2013年

1
@ user8009该错误消息可能由于多种原因而发生。如果您无法获得FTP访问权限,或者无法在系统的本地/开发版本中重现该问题,那么您将永远无法解决问题。
艾伦·斯托姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.