CakePHP принадлежит отношению с переменным полем «модель»

У меня проблема с отношением belongsTo в CakePHP.

У меня есть модель «Действие», которая использует таблицу «действия» и относится к одной из двух других моделей: «Транзакция» или «Тег». Идея состоит в том, что всякий раз, когда пользователь завершает транзакцию или добавляет тег, модель действия создается для ведения журнала. Я работаю над этой частью, всякий раз, когда сохраняется Транзакция или Тег, метод aftersave () также добавляет запись Action. Проблема возникает, когда я пытаюсь выполнить поиск («все») в модели Action, связанная транзакция или запись тега не возвращаются.

действия:

id model model_id created 

Я думал, что я могу использовать параметр «условия» в отношениях, относящихся к этому типу:

 <?php class Action extends AppModel { var $name = 'Action'; var $actsAs = array('Containable'); var $belongsTo = array( 'Transaction' => array( 'foreignKey' => 'model_id', 'conditions' => array("Action.model"=>"Transaction") ), 'User' => array( 'fields' => array('User.username') ), 'Recommendation' => array( 'conditions' => array("Action.model"=>"Recommendation"), 'foreignKey' => 'model_id' ) ); } ?> 

Но это не работает.

Я что-то пропустил здесь, мои отношения неправильные (я подозреваю, что так)? После того, как Google попытался решить эту проблему, я перебираю то, что называется Полиморфным Поведением, но я не уверен, что это поможет мне.

Если я правильно понимаю, это похоже на то, что Полиморфное поведение – отличный ответ. Он позволяет привязать запись о Action к любой другой модели (в вашем случае Transaction или Tag ). Если вы затем загрузите приложение Action and memory (я использовал его только один раз), то соответствующая модель снова вернется (при условии соответствующей recursive настройки).

Например, в недавнем проекте я построил модель Alert . Оповещения могут быть прикреплены к любой модели. Любая заданная запись оповещения идентифицировала, к какой модели она принадлежала, и соответствующий идентификатор записи:

 class Alert extends AppModel { public $actsAs = array ( 'Polymorphic' => array ( 'classField' => 'model', 'foreignKey' => 'entity_id' ) ); # Additional model code } 

И мой стол был построен по следующей спецификации:

 CREATE TABLE alerts ( id CHAR(36) NOT NULL, alert_template_id VARCHAR(255) NOT NULL, model VARCHAR(255) NOT NULL, entity_id CHAR(36) NOT NULL, valid_from BIGINT NULL, valid_to BIGINT NULL, replacement_keys TEXT NULL, active BOOL NOT NULL DEFAULT 0, created BIGINT NOT NULL, updated BIGINT NOT NULL, PRIMARY KEY(id), FOREIGN KEY(alert_template_id) REFERENCES alert_templates(id) ON DELETE NO ACTION ON UPDATE NO ACTION )TYPE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

Обратите внимание на entity_id и model . Для каждой записи Alert они содержат уникальный идентификатор и имя модели (например, User ), соответственно. Похоже, это удовлетворит ваши потребности.

Итак, если я прав, вы хотите сохранить данные автоматически в таблице «Действия»? Возможно, другие пользователи дадут ответ, что это возможно, но насколько я знаю, это не так.

Может быть, неплохо посмотреть на обратный вызов модели «afterSave ()». Здесь вы можете сделать save () после выполнения другого запроса.