免責聲明我是自學的。有我的PHP閱讀論壇的基本知識。我是一個sql newb,並且幾乎不知道yii。yii分頁問題試圖使用2標準
我有一個控制器,顯示我們的網上商店的產品。我希望缺貨產品在最後幾頁上出現。
我知道我可以根據庫存數量進行排序,但是希望在每次頁面重新加載時都有貨產品更改訂單。
我的解決方案(可能是錯誤的,但有點作品)是運行兩個查詢。一種用於存貨的產品,隨機排序。一個缺貨產品也隨機訂購。然後我合併兩個結果數組。這很多工作使用下面的代碼(儘管我覺得必須有比運行兩個查詢更有效的方法)。
問題是,這會弄亂分頁。返回的每件產品都列在同一頁面上,並且更改頁面顯示相同的結果。據我所知,分頁只能同時適用於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可用於分頁(因爲它會加入相同數量的產品作爲第一的綜合結果2)。所以我嘗試添加該(標準1和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
));
我敢肯定,我在這裏的東西超級明顯......一直在尋找一整天一事無成。
使用隨機排序分頁通常沒有意義,爲什麼你會這樣做?爲什麼不只是單一的查詢與多個訂購條件(首先是可用性,然後是任何您的主要排序字段將是)? –
感謝您的答覆邁克。點擊我們商店中的類別有時會產生數百種產品,我們不希望在同一頁面上顯示所有這些結果。隨機排序是這樣的:返回該類別的人可以看到新鮮的產品,而不是出現在第一頁上的相同的產品。我不確定如何按可用性進行訂購,「inventory_avail」的訂購將按數量排序,以便擁有大量庫存的產品總是首先顯示,這對我們來說並不理想。 –