رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
راهنمایی در مورد CDbCriteria و صفحه بندی با دو جدول (حل شد)
#1
سلام
من از کد زیر برای نمایش جداول  posts  و tags  استفاده کرده ام و برای حالتی که از pagination استفاده نکرده ام کار میکند ولی در حالت pagination  پاسخ نمیدهد

                $totalPosts = Posts::model()->with(
            array(
                'tags'=>array(
                    'condition'=>'tags.id=:tagId AND tags.confirmed=1',
                    'params'=>array(
                        ':tagId'=>1
                    )
                )
            )
        )->count('t.confirmed=1');
        $itemsPerPage = 10;
        $pageCount = ceil($totalPosts / $itemsPerPage);
        $page = max(1, intval($page));
        
        $posts = Posts::model()->with(
            array(
                'tags'=>array(
                    'condition'=>'tags.id=:tagId AND tags.confirmed=1',
                    'order'=>'t.id DESC',
                    'limit'=>$itemsPerPage,
                    'offset'=>(($page - 1) * $itemsPerPage),
                    'params'=>array(
                        ':tagId'=>1
                    )
                )
            )
        )->findAll('t.confirmed=1');

من تصور میکنم که برای ساخت pagination حتما کد کوئری را باید با استفاده از کلاس CDbCriteria تولید کرد چون من باید از 2 جدول استفاده کنم با اشکال مواجه میشوم
لطفا در مورد تولید کوئری مشابه برای بیش از یک جدول در کلاس CDbCriteria راهنمائی بفرمائید
با تشکر
پاسخ
تشکر شده توسط:
#2
کد کامل اکشن رو بگذارین تا راهنمایی کنم. وقتی Pagination رو دارین با Criteria میسازین، مدل رو هم باید با Criteria بارگذاری کنید.
پاسخ
تشکر شده توسط:
#3
من کد زیر را برای جدول posts برای ساخت pagination با استفاده از کلاس CDbCriteria طبق آموزش شما در پروژه گالری استفاده کرده ام که بخوبی کار می کند
    public function actionIndex($page = 1)
   {
       
       
       $itemsPerPage = 10;
       $criteria = new CDbCriteria;
       $criteria->condition = 'user_id=:userId AND confirmed=1';
       $criteria->params = array(':userId'=>Yii::app()->user->id);
       $totalPosts = Posts::model()->count($criteria);
       $pageCount = ceil($totalPosts / $itemsPerPage);
       $page = max(1, intval($page));
       $criteria->limit = $itemsPerPage;
       $criteria->order = 'id DESC';
       $criteria->offset = ($page - 1) * $itemsPerPage;
       $posts = Posts::model()->findAll($criteria);
       $this->render('index', compact('posts', 'pageCount', 'page'));
       
   }
و در index کد زیر را قرار دادم
<?php foreach($posts as $post) : ?>
<?php $this->renderPartial('_view', compact('post')); ?>
<?php endforeach; ?>
<?php if($pageCount > 1) : ?>
<ul class="pagination">
   <?php for($i = 1; $i <= $pageCount; $i++) : ?>
   <li<?php echo ($i == $page ? ' class="active"' : ''); ?>>
       <a href="<?php echo ($i == $page ? '#' : $this->createUrl('index', array('page'=>$i))); ?>"><?php echo $i; ?></a>
   </li>
   <?php endfor; ?>
</ul>
<?php endif; ?>
که بخوبی کار میکند


ولی برای 2 جدول نتوانستم از روش بالا استفاده کنم و مجبور شدم  از کد زیر استفاده کنم
    public function actionIndex($page = 1)
   {
       // renders the view file 'protected/views/site/index.php'
       // using the default layout 'protected/views/layouts/main.php'
       $totalPosts = Posts::model()->with(
           array(
               'tags'=>array(
                   'condition'=>'tags.id=:tagId AND tags.confirmed=1',
                   'params'=>array(
                       ':tagId'=>1
                   )
               )
           )
       )->count('t.confirmed=1');
       $itemsPerPage = 10;
       $pageCount = ceil($totalPosts / $itemsPerPage);
       $page = max(1, intval($page));
       
       $posts = Posts::model()->with(
           array(
               'tags'=>array(
                   'condition'=>'tags.id=:tagId AND tags.confirmed=1',
                   'order'=>'t.id DESC',
                   'limit'=>$itemsPerPage,
                   'offset'=>(($page - 1) * $itemsPerPage),
                   'params'=>array(
                       ':tagId'=>1
                   )
               )
           )
       )->findAll('t.confirmed=1');
       
       $this->render('index', compact('posts', 'pageCount', 'page'));
   }
و در index نیز این کد را قرار داده ام
<?php foreach($posts as $post) : ?>
<?php $this->renderPartial('/posts/_view', compact('post')); ?>
<?php endforeach; ?>
<?php if($pageCount > 1) : ?>
<ul class="pagination">
   <?php for($i = 1; $i <= $pageCount; $i++) : ?>
   <li<?php echo ($i == $page ? ' class="active"' : ''); ?>>
       <a href="<?php echo ($i == $page ? '#' : $this->createUrl('index', array('page'=>$i))); ?>"><?php echo $i; ?></a>
   </li>
   <?php endfor; ?>
</ul>
<?php endif; ?>
که متاسفانه کار نمیکند
لطفا راهنمائی فرمائید
با تشکر
پاسخ
تشکر شده توسط:
#4
اینو امتحان کنین:
public function actionIndex($page = 1)
{
    // renders the view file 'protected/views/site/index.php'
    // using the default layout 'protected/views/layouts/main.php'
    $criteria = new CDbCriteria;
    $criteria->with = 'tags';
    $criteria->together = true; // force to join
    $criteria->addColumnCondition(array('tags.id' => 1, 'tags.confirmed' => 1, 't.confirmed' => 1));
    $totalPosts = Posts::model()->count($criteria);
    $itemsPerPage = 10;
    $pageCount = ceil($totalPosts / $itemsPerPage);
    $page = max(1, intval($page));
    $criteria->order = 't.id DESC';
    $criteria->limit = $itemsPerPage;
    $criteria->offset = ($page - 1) * $itemsPerPage;
    $posts = Posts::model()->findAll($criteria);
    $this->render('index', compact('posts', 'pageCount', 'page'));
}
پاسخ
تشکر شده توسط: ADMIN , hfaal
#5
با تشکر فراوان
بخوبی کار میکند
و این همان کوئری ارتباط تعداد 2 و بیشتر جدول است که میخواستم
ممنونم
پاسخ
تشکر شده توسط:




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