2015-09-16 140 views
0

我正在與CakePHP一起開發一個Web應用程序,該應用程序具有幾個表格以及它們之間的一些關係。在這種情況下,我有一系列涉及日曆年,部門和相關學校的會議,但是當數據從控制器返回到視圖時,模型無法獲取關聯的表信息。CakePHP模型無法抓取表關聯

已經有$belongsTo工作人員與他們所屬的部門和學校之間的關係,並且當日歷數組返回日曆索引時,我也設法抓住相關會議,但理想情況下我希望能夠列出所有與日曆,部門和學校的名稱會面,而不是存儲在會議表中的ID字段。

這裏是我的表:

dbo.meetings 
    id (int) *primary key* 
    calendar_id (int) 
    department_id (int) 
    school_id (int) 
    created (datetime2(7)) 
    modified (datetime2(7)) 

dbo.calendar 
    id (int) *primary key* 
    name (nvarchar(50)) 
    startdate (datetime2(7)) 
    enddate (datetime2(7)) 
    created (datetime2(7)) 
    modified (datetime2(7)) 

dbo.schools 
    id (int) *primary key* 
    name (nvarchar(255)) 
    (other fields) 

dbo.departments 
    id (int) *primary key* 
    name (nvarchar(255)) 
    (other fields) 

下面是會議控制器:

<?php 
App::uses('AppController','Controller'); 

class MeetingsController extends AppController { 
    public $helpers = array('Form'); 

    public function beforeFilter() { 
     parent::beforeFilter(); 
    } 

    public function index() { 
     $this->set('meetings', $this->Meeting->find('all')); 
    } 
} 
?> 

下面是會議的模式:

<?php 
App::uses('AppModel','Model'); 

class Meeting extends AppModel { 
    public $primaryKey = 'id'; 
    public $recursive = -1; 

    public $belongsTo = array(
     'Calendar' => array(
      'className' => 'Calendar', 
      'foreignKey' => 'calendar_id' 
     ), 
     'School' => array(
      'className' => 'School', 
      'foreignKey' => 'school_id' 
     ), 
     'Department' => array(
      'className' => 'Department', 
      'foreignKey' => 'department_id' 
     ) 
    ); 
} 
?> 

目前index.ctp文件中/View/Meetings只包含打印出數組unti的<?php echo var_dump($meetings); ?>我可以讓協會工作,然後我會根據需要進行調整。

這裏是陣列的樣子大氣壓:

array(1) { 
    [0]=> 
    array(1) { 
    ["Meeting"]=> 
    array(6) { 
     ["id"] => string(1) "1" 
     ["calendar_id"] => string(1) "1" 
     ["department_id"] => string(2) "33" 
     ["school_id"] => string(1) "1" 
     ["created"] => NULL 
     ["modified"] => NULL 
    } 
    } 
} 

出於某種原因,它只是將不會獲取日曆,部門和學校的詳細信息,它應該和我想它。誰能幫忙?

編輯:示範學校

<?php 
App::uses('AppModel','Model'); 

class School extends AppModel { 

    public $validate = array(
     'name' => array(
      'required' => array(
       'rule' => 'notBlank', 
       'message' => 'A school name is required.' 
      ) 
     ) 
    ); 
} 
?> 
+0

你看聯想錯誤。你能否確認「日曆」,「學校」和「部門」表格的模型被調用? – drmonkeyninja

+0

@drmonkeyninja日曆,學校和部門分別 – Daniel

+0

您有沒有理由不理會Cake的命名約定?它只會讓你的生活更加艱難! – drmonkeyninja

回答

0

確保要啓用Containable behaviour使用public $actsAs = ['Containable'];模型的: -

App::uses('AppModel','Model'); 

class Meeting extends AppModel { 
    public $recursive = -1; 
    public $actsAs = array('Containable'); 

    public $belongsTo = array(
     'Calendar', 
     'School', 
     'Department' 
    ); 
} 

申請中可容納所有型號設置在AppModel這樣每個模型都會繼承這個行爲。此外,只要您堅持使用CakePHP命名約定,您不需要指定關聯的classNameforeignKey

現在$this->Meeting->find('all')MeetingsController應與會議一起返回所有相關數據。如果您只希望它返回一些關聯數據,則可以將contain選項傳遞給find。例如: -

$this->Meeting->find(
    'all', 
    array(
     'contain' => array(
      'School', 
      'Department' 
     ) 
    ) 
); 
+0

它抱怨意想不到的'['第6行是'public $ actsAs = ['Containable'];' – Daniel

+0

@Daniel,對不起。你顯然使用的是舊版本的PHP,它不能識別'[]'數組的簡寫形式。只需用'array()'替換方括號即可。我會相應地更新答案。 – drmonkeyninja

+0

從PHP 5.4開始,我們已經能夠用'[]'替換'array()'。看到對5.4的支持在兩天前結束,您應該至少將PHP 5.5作爲最低工作,儘管我明白這並非總是可行。 – drmonkeyninja