Я работаю с 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
просто содержит <?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.'
)
)
);
}
?>
Убедитесь, что вы включаете Содержимое поведение для использования вашей модели public $actsAs = ['Containable'];
: —
App::uses('AppModel','Model');
class Meeting extends AppModel {
public $recursive = -1;
public $actsAs = array('Containable');
public $belongsTo = array(
'Calendar',
'School',
'Department'
);
}
Чтобы применить Containable ко всем моделям, установите его в AppModel, чтобы каждая модель наследовала поведение. Кроме того, пока вы придерживаетесь правил именования CakePHP, вам не нужно указывать className
а также foreignKey
ваших ассоциаций.
Сейчас $this->Meeting->find('all')
в вашем MeetingsController
должен вернуть все связанные данные вместе со встречей. Если вы хотите, чтобы он только возвращал некоторые связанные данные, вы можете передать contain
вариант к find
, Например:-
$this->Meeting->find(
'all',
array(
'contain' => array(
'School',
'Department'
)
)
);
Других решений пока нет …