2013-02-10 29 views
1

在一個應用程序中,講座有許多幻燈片和一張幻燈片,屬於一個講座。當講座的索引功能被調用時,我們希望添加一個列來顯示屬於某個講座的幻燈片的數量。定義並訪問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 determin屬於該演講稿的量。

最後我做到了,在視圖中:

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或$講座陣列。但我覺得這個觀點不是處理這個問題的地方。

達到此目標的最佳做法是什麼?

回答

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); 
+0

非常感謝您的回覆。你的代碼是 - 儘管我的sl question問題 - 非常確切。我認爲這個數組被foreach循環改變了,但我用 '$ this-> set('lectures',$ this-> paginate());' 而不是: '$ this-> set ('lectures',$ lectures);' 這導致修改的$講座沒有正確傳遞(?)。也許有人可以給我一個提示,以提高我的理解,並進一步正確使用paginate()函數。 – 2013-02-10 13:35:07

+0

我更新了我的答案......希望這有助於分頁。 – 2013-02-10 13:52:31

+1

再次感謝。此外,我必須在控制器中將deafult查詢條件定義爲'public $ paginate = array(...)'以避免'間接修改重載屬性LecturesController :: $ paginate沒有任何作用[APP \ Controller \ LecturesController.php,第28行]' – 2013-02-10 14:05:46

相關問題