2015-09-16 101 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