CakePHP относится к связи с переменным полем 'модель' - PullRequest
0 голосов
/ 11 марта 2010

У меня проблема с отношением принадлежность к CakePHP.

У меня есть модель «Действие», которая использует таблицу «действия» и принадлежит к одной из двух других моделей: «Транзакция» или «Тег». Идея состоит в том, что всякий раз, когда пользователь завершает транзакцию или добавляет тег, создается модель действия, чтобы вести ее журнал. У меня эта часть работает, всякий раз, когда транзакция или тег сохраняются, метод aftersave () также добавляет запись действия. Проблема возникает, когда я пытаюсь выполнить поиск ('all') в модели 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 этой проблемы я наткнулся на то, что называется Полиморфное поведение , но я не уверен, что это поможет мне.

Ответы [ 2 ]

4 голосов
/ 11 марта 2010

Если я правильно понимаю, звучит так, что Полиморфное поведение - отличный ответ. Это позволяет вам привязать запись Action к любой другой модели (в вашем случае, Transaction или Tag). Если вы затем извлекаете Action - и память служит (я использовал это только один раз) - тогда соответствующая модель также вернется (при условии соответствующей настройки 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) соответственно. Похоже, что это удовлетворит ваши потребности.

0 голосов
/ 11 марта 2010

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

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

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