Otomatik Zend Framework varsayılan davranışı bozmadan tabloları birleştirme

3 Cevap php

Aşağıdaki gibi durum: 'Eylem' ve 'Kullanıcı': ben 2 model var. Bu modeller sırasıyla tablo 'eylemleri' ve 'kullanıcılara' bakın.

Benim eylem tablo sütun 'user_id' içeriyor. Bu noktada, tüm eylemlerin genel bir bakış, ve atandıkları için kullanıcıların ihtiyaç. I $ aksiyon-> fetchAll () kullandığınızda, ben sadece bu yüzden tercihen findDependentRowset çağrısı () yapmadan, kullanıcı model verileri katılmak mümkün olmak istiyorum, kullanıcı kimliği var.

I (), fetchRow () özel fetchAll oluşturma hakkında düşündüm ve benim modelinde () yöntemlerini bulmak, ancak bu varsayılan davranışı kıracak.

Bu sorunu çözmek için en iyi yolu nedir? Herhangi bir yardım büyük mutluluk duyacağız.

3 Cevap

Ben Zend Framework tablo ilişkileri özelliğini tasarlanmış ve uygulanmıştır.

Eylem Kullanıcıya bir yabancı anahtar referansı vardır eğer findParentRow() kullanmak istiyorum - Benim ilk comment findDependentRowset() yine de kullanmak olmaz olmasıdır.

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

Edit: döngüsünde, artık bir $ actionRow ve $ userRow nesnesi var. Sen nesne alanları değişiyor ve nesne üzerinde save() arayarak ya nesnesi yoluyla geri veritabanına değişiklikleri yazabilirsiniz.

Ayrıca Eylem ve kullanıcı arasındaki katılmak dayalı bir satır kümesi almak için (ben projeyi ayrıldıktan sonra hayata geçirildi) Zend_Db_Table_Select sınıfını 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());
}

Bir katılmak sorguya dayalı böyle bir satır kümesi olduğu salt okunur unutmayın. Sen save() geri veritabanına değişiklikleri göndermek için Satır nesneleri ve çağrı alan değerlerini ayarlanamaz.

Edit: rasgele katıldı sonuç yazılabilir set yapmak için hiçbir yolu yoktur. Yukarıda belirtilen katıldı sonuca dayalı basit bir örneği ele alalım:

action_id  action_type  user_id  user_name
   1          Buy          1       Bill
   2          Sell         1       Bill
   3          Buy          2       Aron
   4          Sell         2       Aron

Sonraki action_id = 1 satır, ben Kullanıcı nesneden gelen alanlardan birini değiştirin:

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

Sorular: I = 2 action_id ile sonraki satır görmek, ben 'Bill' veya 'William' görmek gerekir? 'William', bu satırı 1 tasarruf otomatik olarak bu sonuçla tüm diğer satırlar kümesindeki 'William' için 'Bill' güncellemek zorunda olduğu anlamına gelir mi? Yoksa save() otomatik olarak yenilenir sonucu veritabanından set almak için SQL sorgu yeniden çalışır demek? Ne sorgu zaman alıcı olur?

Ayrıca, nesne yönelimli tasarım düşünün. Her Satır ayrı bir nesnedir. O save() bir nesne çağıran (onlar nesnelerin aynı koleksiyon parçası olsa bile) ayrı bir nesne içinde değişen değerlerin yan etkisi olduğunu uygun mudur? İşte Content Coupling Benim için bir form gibi görünüyor.

Yukarıdaki örnekte nispeten basit bir sorgu, ama çok daha karmaşık sorguları da izin verilir. Zend_Db salt okunur sonuçlar yazılabilir sonuçlarını anlatmak için niyeti ile sorguları analiz edemezsiniz. MySQL hit güncelleştirilebilir değil bu yüzden de bulunuyor.

Her zaman sizin için katılırsa veritabanınızda bir görünüm yaratabilir.

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

Sonra sadece kullanmak

$vwAction->fetchAll();

Sadece MySQL görünümleri salt okunur olduğunu (bu MySQL olduğunu varsayarak) hatırlıyorum

isn't creating a view sql table a good solution to make joint ? and after a simple table class to access it

Ben mantık php daha sql ise daha iyi düşünürdüm