2016-01-27 3 views
1

У меня есть две таблицы 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`)); 
+0

Я не знаю достаточно о 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

ответ

3

Использование присоединиться к построитель запросов, больше http://book.cakephp.org/3.0/en/orm/query-builder.html#adding-joins

public function getAllClazzesRecursive(){ 
    return $this 
     ->find('all') 
     ->join([ 
      'table' => 'clazzes_teachers', 
      'alias' => 'ct', 
      'type' => 'LEFT', 
      'conditions' => 'ct.clazz_id= clazzes.id', 
     ]) 
     ->where('ct.id IS NULL') 
     ->hydrate(false)->toArray(); 
} 

вы также можете использовать leftJoin() непосредственно.

Смежные вопросы