【问题标题】:Select products by data attribute in Magento在 Magento 中按数据属性选择产品
【发布时间】:2017-03-17 04:07:45
【问题描述】:

我创建了一个具有自定义数据属性的新产品。

$product = Mage::getModel('catalog/product');
$product->setStatus(Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
$product->setVisibility(Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
$product->setName('name');
$product->setDescription('description');
$product->setPrice(1.24);
$product->setData('lid', 123);
$product->save

现在我想使用 Mage::getModel('catalog/product') 查询该产品。

如何查询带有'lid' 123 的产品?

如何查询存在“lid”且不为空的产品?

=================

使用 addAttributeToFilter 执行查询时的错误日志。

( ! ) Fatal error: Call to a member function getBackend() on boolean in /Users/asdf/Sites/magento19.dev/app/code/core/Mage/Eav/Model/Entity/Abstract.php on line 816
Call Stack
#   Time    Memory  Function    Location
1   0.0002  249016  {main}( )   .../index.php:0
2   0.0024  514024  Mage::run( )    .../index.php:87
3   0.0085  1433456 Mage_Core_Model_App->run( ) .../Mage.php:684
4   0.0729  7141088 Mage_Core_Controller_Varien_Front->dispatch( )  .../App.php:354
5   0.0776  7404488 Mage_Core_Controller_Varien_Router_Standard->match( )   .../Front.php:172
6   0.0825  7941968 Mage_Core_Controller_Varien_Action->dispatch( ) .../Standard.php:250
7   0.1205  10859488    Asdf_Sync_Adminhtml_SyncbackendController->indexAction( )   .../Action.php:418
8   0.1535  13447744    Asdf_Sync_Adminhtml_SyncbackendController->performSync( )   .../SyncbackendController.php:18
9   0.1542  13504568    Asdf_Sync_Helper_Data->pushProducts( )  .../SyncbackendController.php:33
10  0.3723  17554640    Mage_Catalog_Model_Resource_Product_Collection->addAttributeToFilter( ) .../Data.php:67
11  0.3723  17555008    Mage_Eav_Model_Entity_Collection_Abstract->addAttributeToFilter( )  .../Collection.php:1438
12  0.3723  17555360    Mage_Eav_Model_Entity_Collection_Abstract->_getAttributeConditionSql( ) .../Abstract.php:321
13  0.3723  17555472    Mage_Eav_Model_Entity_Abstract->isAttributeStatic( )    .../Abstract.php:1379

【问题讨论】:

  • 您是否创建了代码为lid的产品属性?
  • 不,我没有。这可以在 PHP 中完成吗?我认为这必须在模块安装时完成?

标签: php magento magento-1.9


【解决方案1】:

理论上您可以过滤产品集合:

$product = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('lid', 123);

foreach ($product as $products) { /** @var Mage_Catalog_Model_Product $product */
    // Product Collection Here
}

【讨论】:

  • 这会导致错误“致命错误:调用 /Users/pimreijersen/Sites/magento19.dev/app/code/core/Mage/Eav/Model 中布尔值的成员函数 getBackend() /Entity/Abstract.php 第 816 行"
  • 你能分享更多的异常跟踪吗?这是标准功能,没有理由不应该工作
  • 嘿 Robbie,trace 很想发表评论,已将其添加到问题中。
  • 这指向错误配置的属性。您是使用设置脚本还是使用管理 UI 创建的?
  • 没有,PHP中可以配置属性吗?
【解决方案2】:

为了创建属性,在你的magento根目录中运行这个脚本(你可以根据你的要求编辑它)

<?php  

require_once('app/Mage.php');
 Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));

$installer = new Mage_Eav_Model_Entity_Setup('core_setup');
$installer->startSetup();                   

$installer->addAttribute('catalog_product', 'lid', array(
             'label'             => 'LId',
             'type'              => 'int',
             'input'             => 'text',
             'backend'           => '',
             'frontend'          => '',
             'global'            => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
             'visible'           => true,
             'required'          => false,
             'user_defined'      => false,
             'searchable'        => false,
             'filterable'        => false,
             'comparable'        => false,
             'visible_on_front'  => true,
             'visible_in_advanced_search' => false,
             'unique'            => false
));
$installer->endSetup();

?>

现在您的属性已创建,请参阅我有 created
然后设置你想要的值see

试试这个按属性过滤产品。

$product = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('lid', 123);

foreach ($product as $products) { 
    echo '<pre>';
    print_r($products);
}

获取具有 Lid Exist 的产品

$product = Mage::getModel('catalog/product')
    ->getCollection();


foreach ($product as $products) { 
    if($products->getLid()){
       echo $products->getName().'-->'.$products->getLid().'<br>';
    }
}

【讨论】:

  • 它对我有用。我创建了属性“技术”。
  • 我不想从后端创建属性。模块应该是独立的。是否可以从 PHP 创建属性?您是否还可以提供一个查询“我如何查询 'lid' 存在的产品,也就是不为空?”
  • 谢谢 KetanKp,帮了我很多。但是,知道如何获取在查询中设置了“盖子”属性的产品吗?循环遍历所有产品感觉有点低效
  • 我已将代码放在“Get product with Lid Exist”下面,所有具有“lid”的产品都将被列出。
【解决方案3】:

如果只能加载一个产品

$product = Mage::getModel('catalog/product')->load(123,'lid')

如果你需要加载一个集合

$product = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('lid', 123);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多