Как смоделировать троичные отношения в CakePhp? - PullRequest
2 голосов
/ 31 августа 2011

Страница таблицы
(1)
|
|
(*)
User_Moderate_Page (*) ----------- (1) Таблица уровня доступа
(*)
|
|
(1)
Таблица пользователей

Как мне моделировать такие троичные отношения в CakePhp?Пользователь на страницу может быть смоделирован с использованием отношения hasBelongtoMany.Но User_Moderate_page - это просто таблица ассоциации. Должен ли я даже написать Model для User_Moderate_Page в Cake?

Ответы [ 3 ]

1 голос
/ 15 февраля 2014

Позвольте мне обобщить это, описав его с помощью общих таблиц: допустим, у вас есть 3 таблицы - первые, секунды, трети - каждая с первичными ключами 'id'.

пусть ваша таблица соединения будет называться 'firsts_seconds_thirds'с внешними ключами для каждой основной таблицы:

  • first_id
  • second_id
  • third_id

обычно мы определяем отношения HABTM между таблицами, в этом случае нам нужно создать модель тортов для объединяемой таблицы - назовем ее FirstsSecondsThird (в соответствии с соглашениями по именованию cakePhp)

Отношения между моделями, которые вам нужно определить:

  • Первый hasMany FirstsSecondsThird
  • Второй hasMany FirstsSecondsThird
  • Третий имеетМного FirstsSecondsThird
  • FirstsSecondsThird принадлежит Первый, Второй, Третий

Необходимость в этом объяснена здесь - Ассоциации: Соединение моделей вместе Код для того же:

class First extends AppModel {    
    public $hasMany = array(
        'FirstsSecondsThird'  => array(
            'className' => 'FirstsSecondsThird',
            'foreignKey' => 'first_id'
        )
    );
}

//Same for classes 'Second' and 'Third'

class FirstsSecondsThird extends AppModel {
    public $belongsTo = array(
        'First' => array(
            'className' => 'First',
            'foreignKey' => 'first_id'
        ),
        'Second' => array(
            'className' => 'Second',
            'foreignKey' => 'second_id'
        ),
        'Third' => array(
            'className' => 'Third',
            'foreignKey' => 'third_id'
        )
    );
}

Модели идеально настроены, но теперь вставка / обновление / удаление из главной таблицы / таблицы соединения должны выполняться правильно, или они бесполезны.Model::saveMany() и Model::saveAssociated(), с использованием опции 'deep' и т. Д.Читайте об этом здесь .Вам также нужно подумать об УДАЛЕННОМ ОГРАНИЧЕНИИ / КАСКАДЕ для этих таблиц соединений и соответствующим образом смоделировать их.

1 голос
/ 31 августа 2011

Я не уверен, что CakePHP принимает это, но вы должны создать таблицу с первичным ключом и тремя внешними ключами. Примерно так:

CREATE  TABLE IF NOT EXISTS `mydb`.`access_levels_pages_users` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `page_id` INT NOT NULL ,
  `access_level_id` INT NOT NULL ,
  `user_id` INT NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_access_levels_pages_users_pages` (`page_id` ASC) ,
  INDEX `fk_access_levels_pages_users_access_levels1` (`access_level_id` ASC) ,
  INDEX `fk_access_levels_pages_users_users1` (`user_id` ASC) ,
  CONSTRAINT `fk_access_levels_pages_users_pages`
    FOREIGN KEY (`page_id` )
    REFERENCES `mydb`.`pages` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_access_levels_pages_users_access_levels1`
    FOREIGN KEY (`access_level_id` )
    REFERENCES `mydb`.`access_levels` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_access_levels_pages_users_users1`
    FOREIGN KEY (`user_id` )
    REFERENCES `mydb`.`users` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

Теперь я не уверен, что Cake испечет эту таблицу, поэтому вам, возможно, придется попробовать сделать модели вручную, эта таблица будет принадлежать к 3 другим таблицам. Другие 3 таблицы, не связанные с таблицами, должны будут иметь отношение HMABTM с двумя другими, как в пользовательских HMABTM access_levels и pages и т. Д.

Опять же, не уверен, что это будет работать. Я бы посоветовал попытаться выяснить, можете ли вы смоделировать это по-другому.

0 голосов
/ 31 августа 2011

Посмотрите ACL.Это сложно, но это то, что вам нужно (особенно если вам нужна гибкость в настройке, кто может модерировать какую страницу)

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