CakePHP - есть ли способ прямого запроса таблицы HABTM? - PullRequest
1 голос
/ 30 августа 2011

Я пытаюсь проверить, действительно ли Учитель, управляющий классом (в случае моего приложения), отвечает за данный класс.Учитель habtm Классные комнаты и наоборот.

Существует ли какой-либо способ написания метода в модели Учителя, в котором я предоставляю идентификатор пользователя и идентификатор Классной комнаты и возвращаю true или false в зависимости от Учителя, соответствующего Классной комнате.

Я пытался использовать следующий код, но он давал мне много дополнительной информации о моделях, которые мне на самом деле не нужны.Должен быть лучший способ:

$this->bindModel(array('hasOne' => array('ClassroomsTeachers')));
    return $this->find('all', array(
            'conditions' => array('ClassroomsTeachers.teacher_id' => $id),
    ));

Спасибо

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Отношение HABTM - это просто абстракция отношения hasMany-ownTo.
В классе есть много классов. Учитель принадлежит учителю.
Вы можете получить доступ к модели присоединения, как и любая другая модель. Если таблица classrooms_teachers, название модели - ClassroomsTeacher (единственное число в ClassroomsTeachers).

$this->Classroom->ClassroomsTeacher->find('count', array(
    'conditions' => array('teacher_id' => $id, 'classroom_id' => $classroomId)
));
0 голосов
/ 30 августа 2011

Способ «торт» сделать это будет следующим:

$this->Classroom->find('first',array(
    'conditions'=>array(
        'Classroom.id'=>$classrom_id_var
    ),
    'recursive'=>1
)

Используется стандартный рекурсивный флаг. Я настоятельно рекомендую подобный встроенный Containable поведенческий код, так что вы можете сделать следующее:

$classdata = $this->Classroom->find('first',array(
    'conditions'=>array(
        'Classroom.id'=>$classrom_id_var
    ),
    'contain'=>array('Classroom')
)

Любой из них даст вам массив, подобный следующему:

array(
    [Classroom] => array(
        ...teacher data...
    ),
    [Teacher] => array(
        [0] => array(
            [id] => 4
            ....
        ),
        [1] => array( ...teacher 2 data... ),
        [2] => array( ...teacher 3 data... ),
    )
)

Затем вы можете просто просмотреть массив учителей и убедиться, что рассматриваемый учитель находится в этом массиве.

Для этой последней задачи вы можете использовать полезную встроенную Set утилиту - вы можете сделать что-то следующим образом:

$teacherlist = Set::extract($classdata,'/Classroom/id');
if(in_array($teacherlist, $id)) {
    //They're okay
} else {
    //Return an error
}

Если вы действительно хотите написать это в функции модели, посмотрите на опции join в find - это намного проще, чем в bindModel. Или посмотрите на обитаемое поведение .

(отредактировано для переворачивания после перечитывания вопроса)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...