CakePHP模型无法获取表关联

时间:2015-09-16 13:38:23

标签: php cakephp model associations

我正在与CakePHP合作开发一个Web应用程序,它有几个表和它们之间的一些关系。在这种情况下,我有一系列会议参考日历年,部门和相关学校,但是当数据从控制器返回到视图时,模型无法获取相关的表信息。

员工与他们所属的部门和学校之间已经存在$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文件只包含<?php echo var_dump($meetings); ?>,它打印出数组,直到我可以使关联工作,然后我会根据需要重新设置它。

这是数组看起来像atm:

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.'
            )
        )
    );
}
?>

1 个答案:

答案 0 :(得分:0)

确保使用public $actsAs = ['Containable'];为模型启用Containable behaviour: -

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

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

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

要将Containable应用于所有模型,请在AppModel中设置它,以便每个模型都继承该行为。此外,只要您坚持使用CakePHP命名约定,您就不需要指定关联的classNameforeignKey

现在$this->Meeting->find('all')中的MeetingsController应该会随会议返回所有相关数据。如果您只想让它返回一些相关数据,您可以将contain选项传递给find。例如: -

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