在cakePHP中定义和访问虚拟属性 - 在哪里以及如何?

时间:2013-02-10 11:33:49

标签: cakephp

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

我尝试在演讲模型中将其定义为$ 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;
}

我也无法访问当前$讲座对象的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'];
            }   

    }?>

只有在这里我可以访问当前对象或$ lectures数组的id。但我觉得这个观点不是处理这个问题的地方。

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

1 个答案:

答案 0 :(得分: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);