2010-03-11 1 views
0

CakePHP에서 belongsTo 관계에 문제가 있습니다.변수 'model'필드가있는 CakePHP belongsTo 관계

"액션"테이블을 사용하고 "트랜잭션"또는 "태그"두 가지 모델 중 하나에 속하는 "액션"모델이 있습니다. 사용자가 트랜잭션을 완료하거나 태그를 추가 할 때마다 작업 모델이 작성되어 로그를 유지한다는 아이디어가 있습니다. 트랜잭션이나 태그가 저장 될 때마다 aftersave() 메서드는 작업 레코드도 추가합니다. 문제는 액션 모델에서 find ('all')를 시도하면 관련 Transaction 또는 Tag 레코드가 반환되지 않습니다.

행동은 :

<?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' 
    ) 
); 
} 
?> 

을하지만 그건 작동하지 않습니다

id 
model 
model_id 
created 

나는이 같은 belongsTo를 관계의 "조건"매개 변수를 사용할 수 있다고 생각.

여기에 뭔가가 누락 되었습니까? 내 관계가 잘못 되었습니까? 이 문제를 검색 한 후에 나는 Polymorphic Behaviour라고 불리는 것을 가로 질러 갔지만 이것이 도움이 될지 확신하지 못합니다.

답변

4

정확하게 이해하면 다형성 행동이 훌륭한 대답 인 것처럼 들립니다. Action 레코드를 다른 모델 (귀하의 경우 Transaction 또는 Tag)에 연결할 수 있습니다. 그런 다음 Action을 검색하고 메모리가 작동하면 (전 한 번만 사용 했음) 관련 모델도 다시 나타납니다 (적절한 recursive 설정으로 가정).

예를 들어, 최근 프로젝트에서 나는 Alert 모델을 만들었습니다. 모든 모델에 경고를 첨부 할 수 있습니다. 가에 속한 모델 확인 주어진 경고 기록하고 해당 레코드 ID :

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_idmodel 필드. 각각의 Alert 레코드에 대해 고유 식별자 및 모델 이름 (예 : User)이 각각 저장됩니다. 이것이 당신의 필요를 잘 충족시키는 것처럼 들립니다.

+0

위대한 답변 롭! 나는 빵집을 보았을 정도로 오 PM 행동을 더 읽고 싶었습니다. 여기 링크가 있습니다 : http://bakery.cakephp.org/articles/view/polymorphic-behavior –

+0

대단히 고마워요. 그게 정확히 내가 원하는 대답 이었어. – gomezuk

+0

링크를 추가해 주셔서 감사합니다. Travis. 나는 내 대답에 그것을 연결 시키겠다는 확신을 갖고 있었지만 그렇지 않다. 나는 그것을 고쳐 주셔서 감사합니다. –

0

그래서 올바른 경우 데이터를 자동으로 작업 테이블에 저장 하시겠습니까? 어쩌면 다른 사용자가 가능한 답변을 줄 것입니다. 그러나 내가 아는 한 이것이 그렇지 않습니다.

아마도 모델 콜백 'afterSave()'를 살펴 보는 것이 좋습니다. 다른 쿼리가 끝나면 여기에서 save()를 수행 할 수 있습니다.

+0

아니요 트랜잭션 및 권장 모델에서 애프터 세이브 작업을 수행했습니다. 작업 레코드가 저장됩니다. 그러나 액션 모델에서 어떤 ('all')을 찾을 수 있을지는 관련된 트랜잭션 * OR * 권장 모델을 가져오고 싶습니다. 어떤 액션 유형인지에 따라 달라집니다. – gomezuk