У меня есть две таблицы Clazzes
и Teachers
, обе они соединены третьей таблицей clazzes_teachears
. Как я могу получить Clazzes
, у которого нет Teachers
? теперь я могу вернуть только все элементы Clazzes
с или без связанного с ним учителя.Восстановить только записи без записи, связанные с другой таблицей
ClazzesTable.php Initialize
public function initialize(array $config)
{
parent::initialize($config);
$this->table('clazzes');
$this->displayField('name');
$this->primaryKey('id');
$this->belongsToMany('Teachers', [
'foreignKey' => 'clazz_id',
'targetForeignKey' => 'teacher_id',
'joinTable' => 'clazzes_teachers'
]);
}
TeachersTable.php Initialize
public function initialize(array $config)
{
parent::initialize($config);
$this->table('teachers');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsToMany('Clazzes', [
'foreignKey' => 'teacher_id',
'targetForeignKey' => 'clazze_id',
'joinTable' => 'clazzes_teachers'
]);
}
Примечание: не существует ClazzesTeachersTable.php
Метод возврата Все Clazzes с/без учителей, связанных (мне нужно retrive только Clazzes
без Teachers
)
public function getAllClazzesRecursive(){
return $this
->find('all')
->contain([
'Teachers' => function($q) {
return $q->select(['id', 'registry', 'url_lattes', 'entry_date', 'formation', 'workload', 'about', 'rg', 'cpf', 'birth_date', 'situation']);
}
])->hydrate(false)->toArray();
}
Преподаватель SQL:
CREATE TABLE IF NOT EXISTS `teachers` (
`id` INT NOT NULL AUTO_INCREMENT,
`registry` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`));
Clazzes SQL:
CREATE TABLE IF NOT EXISTS `clazzes` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id`));
clazzes_teachers SQL:
CREATE TABLE IF NOT EXISTS `clazzes_teachers` (
`clazz_id` INT NOT NULL,
`teacher_id` INT NOT NULL,
PRIMARY KEY (`clazz_id`, `teacher_id`));
Я не знаю достаточно о cakephp 3.0, чтобы ответить на это правильно, но я думаю, что 'left join clazzes_teachers на clazzes_teachers.clazz_id = clazzes.id' с условием where' where clazzes_teachers.clazz_id is null. Я мог бы написать это с помощью cakephp 2.x 'find ('all', array (...));' если вы думаете, что это поможет. – dragmosh