2008-10-24 36 views
7

için varsayılan davranışı kırmadan tabloları otomatik olarak ekleme: Durum şu şekildedir: 2 modelim var: 'Action' ve 'User'. Bu modeller sırasıyla 'eylemler' ve 'kullanıcılar' tablolarına başvurur.Zend Framework

İşlem tablomda bir sütun user_id bulunur. Şu anda, tüm eylemlere ve atanan kullanıcılara genel bakışa ihtiyacım var. $action->fetchAll()'u kullandığımda, yalnızca kullanıcı kimliğime sahibim, bu yüzden kullanıcı modelinden, tercihen findDependentRowset() numaralı telefonu aramadan verileri birleştirmek istiyorum.

Modelimde özel fetchAll(), fetchRow() ve find() yöntemleri oluşturmayı düşündüm, ancak bu varsayılan davranışı bozardı.

Bu sorunu çözmenin en iyi yolu nedir? Herhangi bir yardım büyük takdir edilecektir.

+0

Zend_Db_Table_Row :: findDependentRowset nesi var() php daha sql ise daha iyi olur düşünürdüm erişilir? –

+1

findDependentRowset() ve findParentRow() öğesinin bir itirazı, her seferinde ilgili satırlara gereksinim duyduğunuzu bildiğinizde bir JOIN ile her iki tablonun sorgulanmasını yapmaktan ziyade, bir seferde tembel yükleme ilişkili satırlar için daha az verimli olmasıdır. –

cevap

14

Ben tasarlanmış ve masa ilişkileri Zend Framework özelliği uygulanan (bu MySQL olduğunu varsayarak) hatırlamak kullanın.

İlk yorumum, findDependentRowset()'u kullanmazsınız - Action'ın Kullanıcı'ya bir yabancı anahtar başvurusu varsa findParentRow()'u kullanırsınız.

$actionTable = new Action(); 
$actionRowset = $actionTable->fetchAll(); 
foreach ($actionRowset as $actionRow) { 
    $userRow = $actionRow->findParentRow('User'); 
} 

Düzenleme: döngüde, artık bir $ actionRow ve $ userRow nesnesi var. Nesne alanlarını değiştirerek ve nesne üzerinde save()'u arayarak, her iki nesneden de veritabanına değişiklikleri yazabilirsiniz.

Ayrıca, Eylem ve Kullanıcı arasındaki birleşim temelinde bir Satır öğesi almak için Zend_Db_Table_Select sınıfını (projeden ayrıldıktan sonra uygulanmış) kullanabilirsiniz.

$actionTable = new Action(); 
$actionQuery = $actionTable->select() 
    ->setIntegrityCheck(false) // allows joins 
    ->from($actionTable) 
    ->join('user', 'user.id = action.user_id'); 
$joinedRowset = $actionTable->fetchAll($actionQuery); 
foreach ($joinedRowset as $joinedRow) { 
    print_r($joinedRow->toArray()); 
} 

Bu tür bir bir Rowset'e birleştirme sorgusuna bağlı olarak salt okunur olduğunu unutmayın. Satır nesnelerinde alan değerlerini ayarlayamaz ve veritabanına geri değişiklikleri göndermek için save() numaralı telefonu arayabilirsiniz.

Düzenleme: Rasgele birleştirilen bir sonuç kümesi yazılabilir yapmanın bir yolu yoktur. katıldı sonucuna dayanarak basit bir örnek yukarıda belirtilen düşünün:

$joinedRow->user_name = 'William'; 
$joinedRow->save(); 

Sorular:

action_id = 1 ile satır için
action_id action_type user_id user_name 
    1   Buy   1  Bill 
    2   Sell   1  Bill 
    3   Buy   2  Aron 
    4   Sell   2  Aron 

Sonra, ben Kullanıcı nesneden gelen alanlardan biri değiştirin: Bir sonraki satırı action_id = 2 ile görüntülediğimde, 'Bill' veya 'William' görmeliyim? 'William' ise, bu, 1. satırın kaydedilmesinin, bu sonuç kümesindeki tüm diğer satırlarda "Bill" i "William" a otomatik olarak güncellemesi gerektiği anlamına mı geliyor? Yoksa, save()'un veritabanından yenilenen bir sonuç almak için SQL sorgusunu otomatik olarak yeniden çalıştırdığı anlamına mı geliyor? Sorgu zaman alıcıysa ne olur?Ayrıca, nesne yönelimli tasarımı da göz önünde bulundurun. Her Satır ayrı bir nesnedir. Bir nesnede save()'u çağırmanın, değerleri aynı nesnenin parçası olsa bile, ayrı bir nesnede değiştirmenin yan etkisine sahip olması uygun mu? Bu bana bir Content Coupling formu gibi görünüyor. Yukarıdaki örnek nispeten basit bir sorundur, ancak çok daha karmaşık sorgulara da izin verilir. Zend_Db, okunabilir sonuçları salt okunur sonuçlardan anlatma niyetiyle sorguları analiz edemez. Ayrıca bu yüzden MySQL görünümleri güncellenemez.

+0

Teşekkürler, açıklamanız durumu açıklıyor; Salt okunur bir nesne döndüren özel bir yöntemle giderim. –

+0

Evet, bu iyi bir çözüm. –

+0

+1 ve Teşekkürler, Ben de böyle bir şey arıyordum. Eğer ZF, RoR'un '' ('all,: includes)' gibi bir şey bulduysa, – Gordon

2

Veritabanınızda her zaman sizin için birleştirme yapan bir görünüm oluşturabilirsiniz.

CREATE OR REPLACE VIEW VwAction AS 
SELECT [columns] 
    FROM action 
    LEFT JOIN user 
    ON user.id = action.user_id 

Sonra sadece
$vwAction->fetchAll(); 

Sadece MySQL görünümleri salt okunur olduğu

1

görünüm sql tablosu oluşturmak için iyi bir çözüm oluşturmuyor? ve basit bir tablo sınıftan sonra

Ben senin mantık