我有几千种产品,想要找到没有图像的所有产品。我试图在管理产品网格中搜索(无图像),但没有结果。如何创建禁用所有这些产品的SQL查询?
答案 0 :(得分:15)
不再考虑SQL。开始考虑Magento的模型。 Magento的模型碰巧使用SQL作为后端。可以通过原始SQL查询事物,但Magento的版本会有所不同,并且可能因您使用的后端而异。
从测试控制器操作运行以下命令,或者从其他位置执行Magento代码。它在模型中查询没有图像的产品
//this builds a collection that's analagous to
//select * from products where image = 'no_selection'
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('image', 'no_selection');
foreach($products as $product)
{
echo $product->getSku() . " has no image \n<br />\n";
//var_dump($product->getData()); //uncomment to see all product attributes
//remove ->addAttributeToFilter('image', 'no_selection');
//from above to see all images and get an idea of
//the things you may query for
}
答案 1 :(得分:6)
我知道这是超级老,但我发现它很有用,所以我想我会发布更新。
作为上述Alan回答的补充,我发现除了'no_selection'之外还有其他场景......可能是因为插件或系统中的一般错误?最后的nlike实际上会找到所有东西,但我只是为了好玩而离开了其他人。
更改集合查询,如下所示:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image',
'like' => 'no_selection'
),
array (
'attribute' => 'image', // null fields
'null' => true
),
array (
'attribute' => 'image', // empty, but not null
'eq' => ''
),
array (
'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
));
答案 2 :(得分:2)
我以各种组合尝试了所有这些答案,只返回了我的目录的一小部分。原因是:我最初使用定制的产品图像导入脚本导入了我的产品。
如果我在导入期间没有为某些行指定图像,则脚本不会为这些图像创建NULL
或空属性值。它根本就没有创建属性行。
由于addAttributeToFilter
默认使用INNER
加入,并且没有要加入的图片属性值,因此此处发布的查询并未捕获这些SKU。
以下代码会返回图像,small_image 或缩略图为空,格式错误,或行完全缺失的所有产品。
addAttributeToFilter
的第三个参数允许您指定与OR
语句的WHERE
子句一起使用的联接类型。
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
array(
array(
'attribute' => 'image',
'null' => '1'
),
array(
'attribute' => 'small_image',
'null' => '1'
),
array(
'attribute' => 'thumbnail',
'null' => '1'
),
array(
'attribute' => 'image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'small_image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'thumbnail',
'nlike' => '%/%/%'
)
),
null,
'left'
);
如果像我一样,您希望将其转换为SQL查询以从SQL客户端导出为CSV,则只需从PHP脚本中打印查询:
echo $products->getSelect();
我在StackOverflow上发布了一些SQL,它会对引用attribute_id
,image
和small_image
属性的thumbnail
整数进行硬编码,但这些可以因安装而异。在Magento中,使用ORM查询比使用SQL要好得多。
答案 3 :(得分:1)
另外,要获取查询Alan描述的sql在幕后运行:
echo (string) $products->getSelect();
答案 4 :(得分:1)
您可以使用此SQL来查看哪个产品没有图像:
SELECT * FROM catalog_product_entity_media_gallery RIGHT OUTER JOIN catalog_product_entity ON catalog_product_entity.entity_id = catalog_product_entity_media_gallery.entity_id WHERE catalog_product_entity_media_gallery.value is NULL
祝你好运!
答案 5 :(得分:0)
我写了一篇博客文章,回过头来用sql查询查找丢失的图片。它不会禁用产品,但它至少是一个开始:http://prattski.com/2010/06/29/magento-sql-to-find-missing-images/。从这一点来说应该很容易做到。如果您的属性ID与我的匹配,则可能需要更改属性ID。
答案 6 :(得分:0)
有两种方法可以做:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('notnull'=>'','neq'=>'no_selection'));
上面的代码应该可行,但在我的情况下它不起作用。所以我试着跟随:
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter('small_image',array('neq'=>'no_selection'));
祝你好运!
答案 7 :(得分:0)
对于没有小图片的产品试试这个
select * from catalog_product_entity_varchar WHERE attribute_id = 86 AND value = 'no_selection'
在eav_attribute表中找到attribute_id
答案 8 :(得分:0)
我只想补充一点,Sean Michaud的答案是正确的,除非我们不需要使用
array (
'attribute' => 'image', // null fields
'null' => true
),
使用该页面:http://bytes.com/topic/sql-server/answers/83267-wildcard-doesnt-match-using-like-varchar-field-wierd
“NULL值不与零长度的字符串相同.NULL 表示没有任何值,SQL标准表示a NULL值永远不会等于任何其他值,包括另一个NULL“
因此%/%/%
不会获得NULL值,但是从上面添加代码我们将修复错误并获取具有NULL值的图像字段。这是结果
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image', // null fields
'null' => true
),
array (
'attribute' => 'image', // check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
));
如果您想使用所有图像属性,代码可能就像这样
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(array(
array (
'attribute' => 'image', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'small_image', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'thumbnail', //Check for information that doesn't conform to Magento's formatting
'nlike' => '%/%/%'
),
array (
'attribute' => 'image', //Check for null fields
'null' => true
),
array (
'attribute' => 'small_image', //Check for null fields
'null' => true
),
array (
'attribute' => 'thumbnail', //Check for null fields
'null' => true
),
));
答案 9 :(得分:0)
我尝试了所有功能,但是当启用平面目录时,这对我有用
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*')
->addAttributeToFilter(
array(
array(
'attribute' => 'image',
'null' => '1'
),
array(
'attribute' => 'small_image',
'null' => '1'
),
array(
'attribute' => 'thumbnail',
'null' => '1'
),
array(
'attribute' => 'image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'small_image',
'nlike' => '%/%/%'
),
array(
'attribute' => 'thumbnail',
'nlike' => '%/%/%'
)
),
null,
'left'
);