Değişken bir 'model' alan ile CakePHP belongsTo ilişkisi

2 Cevap php

Ben CakePHP'de bir belongsTo ilişki ile ilgili bir sorun var.

Ben "eylemler" tablosunu kullanır ve iki diğer modellerinden birine ait bir "Eylem" modelini, "İşlem" veya "Tag" Ya var. Bir kullanıcı bir işlem tamamlandığında veya bir etiket ekler her fikir, eylem modeli bunun bir günlüğünü tutmak için oluşturulan varlık olduğunu. Bir İşlem veya Tag kaydedilir zaman ben, o bölümü çalışma var, aftersave () yöntemi de bir Eylem kaydı ekler. Ben Eylem modeli üzerinde find ('all') yapmaya çalıştığınızda sorun gelir, ilgili işlem veya Tag kayıt geri dönmedi.

actions: id model model_id created

Ben bu gibi belongsTo ilişkide "koşullar" parametresini kullanabilirsiniz düşündüm:

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

Ama çalışmıyor.

Ben burada bir şey eksik, benim ilişkileri (ben öyle sanıyorum) yanlış? Bu sorunu Googling sonra Polymorphic Behaviour denilen bir şey genelinde cam ama bu bana yardımcı olacak emin değilim.

2 Cevap

Eğer doğru anlamak Polimorfik Davranışı büyük bir cevap gibi, bu sesler. Bu bir ver gülüm (sizin durumda, bir Transaction veya Tag) diğer herhangi bir modele Action kayıt bağlamak için izin verir. Eğer bir Action almak - ve bellek (Ben sadece bir kez bu kullandım) - hizmet vermektedir sonra ilişkili modeli de (uygun recursive ayarı varsayarak) geri gelecektir.

Örnek olarak, yeni bir projede ben bir Alert modeli inşa. Uyarılar bir modele bağlı olabilir. Bu ve uygun kayıt KODU aitti hangi modeli tespit herhangi bir uyarı kaydı:

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

  # Additional model code
}

Ve benim tablo şu spec için inşa edilmiştir:

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 ve model alanları edin. Her Alert kayıt için, bu sırasıyla, benzersiz bir tanımlayıcı ve model adını (örneğin, User) tutun. Bu güzel ihtiyaçlarınızı karşılayacak gibi geliyor.

Yanılmıyorsam Yani eğer Eylemler tabloya verileri otomatik olarak kaydetmek ister misiniz? Belki diğer kullanıcıların mümkündür cevap verecektir, ama bildiğim kadarıyla bu değildir.

Belki modeli geri arama 'afterSave ()' bakmak için iyi bir fikirdir. Diğer sorgu yapıldıktan sonra burada () Bir Kaydet yapabilirsiniz.