سلام
من از کد زیر برای نمایش جداول 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 راهنمائی بفرمائید
با تشکر
کد کامل اکشن رو بگذارین تا راهنمایی کنم. وقتی Pagination رو دارین با Criteria میسازین، مدل رو هم باید با Criteria بارگذاری کنید.
من کد زیر را برای جدول 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; ?>
که متاسفانه کار نمیکند
لطفا راهنمائی فرمائید
با تشکر
اینو امتحان کنین:
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'));
}
با تشکر فراوان
بخوبی کار میکند
و این همان کوئری ارتباط تعداد 2 و بیشتر جدول است که میخواستم
ممنونم