تالار گفتمان nCIS.ir

نسخه‌ی کامل: تکرار در کوئری با صفحه بندی
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام قبلا یه سوال پرسیده بودم لینک در تکمیل اون سوال اینو مطرح میکنم.
من وقتی میخوام صفحه بندی کنم بجای 7 تا نتیجه 9 تا میاره اینم کد من.

زمانی که
$_GET['email']

رو ست میکنم این مشکل پیش میاد

$criteria = new CDbCriteria;
$criteria->with = array('orders');
if(!empty($_GET['itemperpage'])){
     $itemperpage = $_GET['itemperpage'];
 }else{
     $itemperpage = $this->settings['itemperpage'];
 }
if(!empty($_GET['email'])){
   $email = CHtml::encode($_GET['email']);
   if($user = Users::model()->findByAttributes(array('email'=>$email))){
       $criteria->together = true;
       $criteria->distinct = true;
       $criteria->addColumnCondition(array('orders.user_id'=>$user->id));
   }
}

$totalProducts = count(Products::model()->findAll($criteria));
$totalPages = ceil($totalProducts / $itemperpage);
$page = max(1, intval($page));      
$criteria->limit = $itemperpage;
$criteria->offset = ($page - 1) * $itemperpage;
$products = Products::model()->findAll($criteria);



ضمنا از 9 تا 2 تاش تکراریه
چون جوین زدین ممکنه برای یه رکورد، اونطرف بیش از یک رکورد وجود داشته باشه و درنتیجه تعداد رکوردهایی که برمیگردونه بیشتر میشه.
چیکار کنم راهش چیه؟
باید با کمک with و همون ریلیشن STAT خروجی رو بگیرین تا برای هر کاربر یک رکورد برگرده.
ریلیشن STAT رو میشه داخل model نزارم و بین کدهای کنترولی درج کنم؟ چون ممکنه فیلترهای مورد نظرم یه موقع دو تا باشه یا یه موقع یکی.
خیر این ریلیشن باید توی خود مدل تعریف بشه. منظورتون رو از فیلتر متوجه نشدم.
یعنی مثلا یه موقع $_GET['email'] مقدار داره یه موقع $_GET['date'] مقدار داره یا هر دو با هم مقدار دارن.مثلا اینطوری

<?php
$criteria = new CDbCriteria;
$criteria->with = array('orders');
if(!empty($_GET['itemperpage'])){
     $itemperpage = $_GET['itemperpage'];
 }else{
     $itemperpage = $this->settings['itemperpage'];
 }
if(!empty($_GET['email'])){
   $email = CHtml::encode($_GET['email']);
   if($user = Users::model()->findByAttributes(array('email'=>$email))){
       $criteria->together = true;
       $criteria->distinct = true;
       $criteria->addColumnCondition(array('orders.user_id'=>$user->id));
   }
}
if(!empty($_GET['date'])){
   $date = CHtml::encode($_GET['date']);
       $criteria->together = true;
       $criteria->distinct = true;
       $criteria->addColumnCondition(array('orders.date'=>$date));
}
 
$totalProducts = count(Products::model()->findAll($criteria));
$totalPages = ceil($totalProducts / $itemperpage);
$page = max(1, intval($page));      
$criteria->limit = $itemperpage;
$criteria->offset = ($page - 1) * $itemperpage;
$products = Products::model()->findAll($criteria);

البته این مثاله چون date باید قبلش با timestamp تبدیل میشد.
خوب اگه شرایط اینطوریه، پس منطقیه که دوبار رکورد درج بشه. علت اینکه بجای 5 رکورد 7 رکورد میبینید اینه که یه کاربر ممکنه چند فاکتور ثبت کرده باشه. اگه میخواین دقیقاً همون تعداد آیتم ببینید، اونوقت باید از with و کلاً Join استفاده نکنید. کاربران رو استخراج کنید و صفحه‌بندی رو براساس اون بسازین. بعد برای هر کاربر یه کوئری دیگه بزنید و فاکتورها رو بخونید. اگه بخواین به همین روش هم کار کنید مشکلی نداره. با همین with هم میشه کار کرد و به جدول orders جوین زد منتها باید برای نمایش، به شکلی عمل کنید که توی صفحه مشخص باشه که دو رکورد متعلق به دو فاکتور هستن.
نقل قول: کاربران رو استخراج کنید و صفحه‌بندی رو براساس اون بسازین. بعد برای هر کاربر یه کوئری دیگه بزنید و فاکتورها رو بخونید.

این قسمت رو متوجه نشدم.منظورتون اینه از لیست کاربران شروع کنم؟ یا ریلیشن STAT بر اساس کاربران باشه؟
در ضمن ریلیشن STAT رو نمیشه توش مثلا متغییر گذاشت یه چیزه ثابته.
میشه مثال کوچیک بنویسید؟
شما دقیقاً چه اطلاعاتی رو میخواین نمایش بدین؟
من کاردکس تمام کالاها رو میخوام.که توی تاپیک قبلی با ریلیشن STAT حل شد ولی مشکل من اینه موقعی که از یک جدول دیگه میخوام فیلتر اعمال کنم همونطور که عرض کردم درست کار نمیکنه.
کاردکس یعنی چی؟ بقول معروف، اون کاری که میخواین انجام بشه رو به فارسی روان و بدون کلمات تخصصی و فنی مطرح کنید. تاپیک قبلی رو هم رها کنید. هم من و هم سایر دوستان روزانه دهها و شاید صدها تاپیک رو بررسی میکنیم. یادمون نیست دیروز ناهار چی خوردیم. مشکل این تاپیک رو توی همین تاپیک بطور کامل مطرح کنید شاید بتونیم کمک کنیم