Nasıl CakePHP'de bir tabloya başvuran bir tabloda birden fazla yabancı anahtarları kullanırım

4 Cevap php

CakePHP kullanarak, ben müşteriler, satıcılar, rehber bağlamak istediğiniz bir genel adres tablo var. tabloların çoğu sadece 1'e 1 ilişki var, ama benim müşterilerimiz tablo 2 istiyorum

perhaps for clarification: I have a customers table

id, int
mailing_address_id, int
billing_address_id, int

ve adresleri tablosu

id,int
addr, varchar
city, varchar
etc....

Şimdi ben adresleri tabloda bir customer_id koyabilirsiniz biliyorum. Ama ben bir satıcıları tablo var, ve kişiler masa ve tüm adresleri tablo kullanmak için gidiyoruz diğer tabloları, çünkü bunu yapmak istemiyorum. customer_id gerçekten bu diğer tablolara relavant olmaz.

Ben müşteri modeli otomatik olarak iki adreslerde bağlamak istiyorum

4 Cevap

Travis leleu önerisini izleyin - ne olursa olsun, iyi bir fikir çünkü.

Sonra denilen Addresses tabloya bir enum alan eklemek table_id. table_id alanının değeri "Müşteri", "satıcı", "iletişim", ve ne olursa olsun diğer tabloları adresleri masaya bağlayacak olabilir.

Ayrıca entity_id adında bir tek yabancı anahtarı içerir. Bu yabancı anahtar birincil gelen müşterinin anahtar, satıcı, ya da ne olursa olur.

Eğer, örneğin, belirli bir satıcı için fatura adresini istediğiniz zaman, $conditions dizide ekleyin:

'Address.entity_id'=>'123456'
'Address.table_id'=>'vendor'
'Address.type'=>'billing'

Eğer Addresses tabloya başvuran istediğiniz gibi bu set-up ile birçok tablolar olabilir.

Jack,

Belki de doğru soruyu anlamıyorum, bu yüzden yanlış ettik özür dilerim.

Herhalde sadece (fatura veya posta) adresi olduğu ne tür kaydetmek için adres tablosundan bir enum alanı yapmak istiyorum. Sonra müşterilerin modeli ve adres model arasında doğrudan bir $ hasMany ilişki kullanabilirsiniz. Eğer bir sorgu gerçekleştirdiğinizde (örneğin, sadece belirli bir müşteri için fatura adresini istiyorum), sadece $ koşulların dizisinde ki 'Address.type' => 'fatura' belirtin.

HTH, Travis

: Bir müşteri hasMany adresleri, var-çok ilişki kullanıyorsanız

http://book.cakephp.org/view/82/hasMany

Bir müşteri HASONE (ve tek) adresi vardır-bir dernek kullanıyorsanız:

http://book.cakephp.org/view/80/hasOne

Müşteriler muhtemelen aynı adresi (aynı kayıt) payı olabilir, size değindiğim katılmak tablo ile habtm kullanmanız gerekecektir.

More info about Cake's associations: http://book.cakephp.org/view/78/Associations-Linking-Models-Together

I Kyle's ve Travis's önerileri istiyorum, ama aynı zamanda yabancı tuşları diğer yöne koyabilirsiniz.

Eğer adresleri bağımsız olmak istiyorum ve birkaç diğer tabloları onları başvuru varsa, o zaman adres müşteriden iki belongsTo relationships tanımlamak gerekir. Her ilişki, daha sonra yabancı anahtar olarak kullanmak için hangi alan belirtmek zorundadır.

<?php

class Customer extends AppModel {
    var $name = 'Customer';                
    var $belongsTo = array(
        'BillingAddress' => array(
            'className'    => 'Address',
            'foreignKey'    => 'billing_address_id'
        ),
        'MailingAddress' => array(
            'className'    => 'Address',
            'foreignKey'    => 'mailing_address_id'
        )
    );  
}
?>

Yabancı anahtar kısıtlaması gerçekten doğru değil, çünkü Ancak, bu çözümlerin, hem yetim adreslere açık bırakın. Basit çözüm sadece böylece customer_id, company_id, employee_id gibi, adres masaya isteğe bağlı yabancı anahtarların bir grup eklemek, ve olabilir. Sonra standart bir yay desen var, ve anahtarlar doğru yönde işaret ediyor, bu yüzden doğru bilgi tutarlılığı olsun.

Başka bir çözüm, bir alt tablo olarak adresi olan daha genel bir varlık tablosu tasarlamaktır. Sonra müşteri, şirket ve çalışanların varlık tablonun tüm alt tipleri vardır. Şema bu tarzı hakkında daha fazla bilgi için, ben Data Model Patterns David Hay tarafından tavsiye.