从自定义模型中滤除项目的最佳方法
-
16-10-2019 - |
题
我有一个自定义模块,我们可以在管理员中添加横幅图像。我已经成功地在管理员中实现了此模块。现在,我想在前端展示横幅。
我的自定义表在下面给出
table name : banner
fields: banner_name | store_ids | images | img_path | status
存储ID和图像被存储为 comma-seperated-values
. 。现在,我想选择与当前商店视图相对应的横幅项目。这是我试图在前端显示横幅模块的代码。
<?php
//get all active banner items as array
$bannerItems = Mage::getModel('banner/banner') -> getCollection()
-> addFieldToFilter('status',1) -> getItems(); //select only enabled items
$curStoreId = Mage::app() -> getStore() -> getId(); //get current store id
$banner = "";
foreach($bannerItems as $item)
{
$data = $item -> getData();
/*
Store ids are saved as `comma separated values`. Hence making
all store_ids as an array
*/
$storearray = explode(",",$data['store_id']);
foreach($storearray as $store)
{
if($store == $curStoreId) //check for matches, if yes load the item
{
$banner = $item;
break;
}
}
if($banner != "") // ensure to store the first matched item to load
{
break;
}
}
//output
if( empty($banner) )
{
die("no banner exist for this store.Please add a banner !!!");
}
else
{
die( print_r( $banner->getId() ) );
}
?>
这为我提供了横幅模型对应于当前商店视图。但是我觉得这个代码很长。因此,我需要知道如何最佳实现这一目标。请提供您的建议。提前致谢
解决方案
我没有“测试过”这个,但这应该很有帮助。
$currentStore = 5;
$bannerItems = Mage::getModel('banner/banner') -> getCollection()
-> addFieldToFilter('status',1);
$bannerItems->getSelect()->where("FIND_IN_SET($currentStore, store_ids) > 0");
$bannerItems->getSelect()->orWhere("store_ids = 0");
$bannerItems->getSelect()->order("(FIND_IN_SET($currentStore, store_ids) > 0 ) * 10 DESC");
首先使用 FIND_IN_SET
还要查找store_ids = 0,但是如果以降顺序存在,则对以前的结果进行排序,以便您可以在第一行获得所需的结果。
之后只使用 $bannerItems->getFirstItem()
, ,在查询中已经完成了一切。