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.
Zend_Db_Table_Row :: findDependentRowset nesi var() php daha sql ise daha iyi olur düşünürdüm erişilir? –
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. –