Отказ от ответственности Я самоучкой. Получил мое рудиментарное знание форумов для чтения php. Я sql newb, и почти ничего не знаю о yii.yii pagination issue пытается использовать 2 критерия
У меня есть контроллер, который показывает продукты на нашем интернет-магазине. Мне бы хотелось, чтобы на последних страницах появились товарные товары.
Я знаю, что я мог бы сортировать по количеству запаса, но хотел бы, чтобы товары на складе меняли порядок каждый раз, когда страница перезагружается.
Мое решение (возможно, неправильное, но любопытное) - это запустить два запроса. Один для продукта с запасом, отсортированный случайным образом. Одновременно с заказом случайно выставляется товар. Затем я объединяю два результирующих массива. Это много работает с использованием кода ниже (хотя я чувствую, что должен быть более эффективный способ, чем запуск двух запросов).
Проблема в том, что это испортит разбивку на страницы. Каждый возвращенный продукт указан на одной странице, и смена страниц показывает те же результаты. Насколько я могу сказать, разбиение на страницы работает только для 1 CDbCriteria за раз. Я просмотрел документы yii для CPagination для этого, но никуда не денусь.
$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
));
Я уверен, что я что-то супер очевидного здесь отсутствую ... разыскивал весь день не получает нигде.
Использование разбиения на страницы со случайным порядком обычно не имеет смысла, зачем вы это делаете? Почему не просто один запрос с несколькими условиями заказа (сначала по доступности, то по какому бы ни было ваше основное поле сортировки)? –
Спасибо за ответ Майк. При нажатии на категорию в нашем магазине иногда может появиться несколько сотен продуктов, мы не хотим, чтобы все эти результаты показывались на одной странице. Случайное упорядочение - это то, что кто-то, возвращающийся в эту категорию, может видеть свежие продукты вместо тех же 30, которые появляются на первой странице. Я не уверен, как упорядочить по доступности, заказывая «inventory_avail», сортируя их по порядку по количеству, чтобы продукты с большим количеством акций всегда показывали сначала, что не идеально для нас. –