【发布时间】:2023-03-13 01:17:01
【问题描述】:
免责声明我是自学的。了解了php阅读论坛的基本知识。我是 sql 新手,对 yii 几乎一无所知。
我有一个控制器,可以在我们的网上商店中显示产品。我希望缺货的产品显示在最后一页。
我知道我可以按库存数量排序,但我希望每次重新加载页面时都更改库存产品的顺序。
我的解决方案(可能是错误的,但有点工作)是运行两个查询。一种用于有库存的产品,随机排序。一件用于缺货的产品也随机订购。然后我合并两个结果数组。使用下面的代码,这很有效(尽管我觉得必须有比运行两个查询更有效的方法)。
问题是这会弄乱分页。返回的每个产品都列在同一页面上,并且更改页面显示相同的结果。据我所知,分页一次仅适用于 1 个 CDbCriteria。我已经查看了 CPagination 的 yii 文档来解决这个问题,但没有得到任何结果。
$criteria=new CDbCriteria;
$criteria->alias = 'Product';
$criteria->addCondition('(inventory_avail>0 OR inventoried=0)');
$criteria->addCondition('Product.parent IS NULL');
$criteria->addCondition('web=1');
$criteria->addCondition('current=1');
$criteria->addCondition('sell>sell_web');
$criteria->order = 'RAND()';
$criteria2=new CDbCriteria;
$criteria2->alias = 'Product';
$criteria2->addCondition('(inventory_avail<1 AND inventoried=1)');
$criteria2->addCondition('Product.parent IS NULL');
$criteria2->addCondition('web=1');
$criteria2->addCondition('current=1');
$criteria2->addCondition('sell>sell_web');
$criteria2->order = 'RAND()';
$crit1=Product::model()->findAll($criteria);
$crit2=Product::model()->findAll($criteria2);
$models=array_merge($crit1,$crit2);
//I know there is something wrong here, no idea how to fix it..
$count=Product::model()->count($criteria);
$pages=new CPagination($count);
//results per page
$pages->pageSize=30;
$pages->applyLimit($criteria);
$this->render('index', array(
'models' => $models,
'pages' => $pages
));
显然,我在我的头上。任何帮助将不胜感激。
编辑:
我认为第三个 CDbCriteria 可以用于分页(因为它包含的产品数量与前两个的组合结果相同)。所以我尝试添加这个(criteria1 和 criteria2 保持不变):
$criteria3=new CDbCriteria;
$criteria3->alias = 'Product';
//$criteria3->addCondition('(inventory_avail>0 OR inventoried=0)');
$criteria3->addCondition('Product.parent IS NULL');
$criteria3->addCondition('web=1');
$criteria3->addCondition('current=1');
$criteria3->addCondition('sell>sell_web');
//$criteria3->order = 'RAND()';
$crit1=Product::model()->findAll($criteria);
$crit2=Product::model()->findAll($criteria2);
$models=array_merge($crit1,$crit2);
$count=Product::model()->count($criteria3);
$pages=new CPagination($count);
//results per page
$pages->pageSize=30;
$pages->applyLimit($criteria3);
$crit1=Product::model()->findAll($criteria);
$crit2=Product::model()->findAll($criteria2);
$models=array_merge($crit1,$crit2);
$this->render('index', array(
'models' => $models,
'pages' => $pages
));
我确定我在这里遗漏了一些非常明显的东西...整天搜索却无处可去。
【问题讨论】:
-
使用随机排序的分页通常没有意义,你为什么要这样做?为什么不只是具有多个排序条件的单个查询(首先是可用性,然后是您的主要排序字段)?
-
感谢迈克的回复。单击我们商店中的类别有时会导致数百种产品,我们不希望所有这些结果都显示在同一页面上。随机排序是为了让返回该类别的人可以看到新鲜产品,而不是第一页上出现的相同的 30 种产品。我不知道如何按可用性订购,按“inventory_avail”订购会按数量排序,这样有大量库存的产品总是首先显示,这对我们来说并不理想。
标签: mysql yii pagination