رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
تکرار در کوئری با صفحه بندی
#1
سلام قبلا یه سوال پرسیده بودم لینک در تکمیل اون سوال اینو مطرح میکنم.
من وقتی میخوام صفحه بندی کنم بجای 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 تاش تکراریه
پاسخ
تشکر شده توسط:
#2
چون جوین زدین ممکنه برای یه رکورد، اونطرف بیش از یک رکورد وجود داشته باشه و درنتیجه تعداد رکوردهایی که برمیگردونه بیشتر میشه.
پاسخ
تشکر شده توسط: hamid
#3
چیکار کنم راهش چیه؟
پاسخ
تشکر شده توسط:
#4
باید با کمک with و همون ریلیشن STAT خروجی رو بگیرین تا برای هر کاربر یک رکورد برگرده.
پاسخ
تشکر شده توسط: hamid
#5
ریلیشن STAT رو میشه داخل model نزارم و بین کدهای کنترولی درج کنم؟ چون ممکنه فیلترهای مورد نظرم یه موقع دو تا باشه یا یه موقع یکی.
پاسخ
تشکر شده توسط:
#6
خیر این ریلیشن باید توی خود مدل تعریف بشه. منظورتون رو از فیلتر متوجه نشدم.
پاسخ
تشکر شده توسط: hamid
#7
یعنی مثلا یه موقع $_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 تبدیل میشد.
پاسخ
تشکر شده توسط:
#8
خوب اگه شرایط اینطوریه، پس منطقیه که دوبار رکورد درج بشه. علت اینکه بجای 5 رکورد 7 رکورد میبینید اینه که یه کاربر ممکنه چند فاکتور ثبت کرده باشه. اگه میخواین دقیقاً همون تعداد آیتم ببینید، اونوقت باید از with و کلاً Join استفاده نکنید. کاربران رو استخراج کنید و صفحه‌بندی رو براساس اون بسازین. بعد برای هر کاربر یه کوئری دیگه بزنید و فاکتورها رو بخونید. اگه بخواین به همین روش هم کار کنید مشکلی نداره. با همین with هم میشه کار کرد و به جدول orders جوین زد منتها باید برای نمایش، به شکلی عمل کنید که توی صفحه مشخص باشه که دو رکورد متعلق به دو فاکتور هستن.
پاسخ
تشکر شده توسط: hamid
#9
نقل قول: کاربران رو استخراج کنید و صفحه‌بندی رو براساس اون بسازین. بعد برای هر کاربر یه کوئری دیگه بزنید و فاکتورها رو بخونید.

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




کاربران در حال بازدید این موضوع: 2 مهمان