1

在一个应用程序中,一个讲座有许多幻灯片,一张幻灯片属于一个讲座。当调用讲座的索引函数时,我们想添加一个列,显示属于某个讲座的幻灯片数量。

我试图将其定义为讲座模型中的 $virtualFields,如下所示:

public $virtualFields = array(
        'slides_amount' => 'SELECT COUNT(*) AS `count` FROM `eflux`.`slides` AS `Slide` LEFT JOIN `eflux`.`lectures` 
            AS `Lecture` ON (`Slide`.`lecture_id` = `Lecture`.`id`) 
                WHERE lecture_id = \''.$id.'\'')';

问题是我无法访问对象的当前 $id ,因此 MySQL 返回错误。

我的下一个尝试是为此使用控制器:

$lectures = $this->Lecture->findByCourseId($course_id);

for ($i = 0; $i < count($lectures); $i++) {
   $slide_amount = $this->Lecture->Slide->find('count', array('conditions' => 'lecture_id = \' '.$id.'\''));
   $slide_amounts[$i] = $slide_amount;
}

我也无法访问当前 $lecture-object 的 id 来确定属于该讲座的幻灯片数量。

最后我在视图中做到了:

for ($i = 0; $i < count($slides_helper); $i++) {
            if ($slides_helper[$i]['slides']['lecture_id'] == $lecture['Lecture']['id']) {
                echo $slides_helper[$i][0]['count'];
            }   

    }?>

只有在这里我才能访问当前对象的 id 或 $lectures 数组。但我觉得视图不是处理这个问题的地方。

实现这一目标的最佳实践是什么?

4

1 回答 1

1

在您的控制器中,您可以尝试:

$lectures = $this->Lecture->find('all', array('conditions'=>array('Lecture.course_id'=>$course_id)));

foreach ($lectures as &$lecture){
   $lecture['Lecture']['slide_count'] = count($lecture['Slide']);
}
$this->set('lectures', $lectures);

然后访问您视图中的计数

foreach ($lectures as $lecture){
    echo $lecture['Lecture']['slide_count'];
}

代码可能不准确......您可以通过粘贴以下代码的结果来帮助我们提供更准确的代码:

把它放在你的控制器中:

$lectures = $this->Lecture->find('all', array('conditions'=>array('Lecture.course_id'=>$course_id)));
pr($lectures);

编辑分页:

像这样的东西可能适用于您的分页

$this->paginate['conditions'] = array('Lecture.course_id'=>$course_id);
$this->paginate['limit'] = '10';

$lectures = $this->paginate('Lecture');

//PERFORM THE LOOP TO ADD SLIDE COUNT

$this->set('lectures', $lectures);
于 2013-02-10T13:11:09.850 回答