Zend: İki Nesneler, bir Satır

2 Cevap php

Geçenlerde bir alışveriş sepeti sitenin siparişleri görüntülemek için yönetici araçları sağlamak, Zend Framework (1.8.4) ile başladım.

Ne yapmak istiyorum verimli tek bir veritabanı sonuç satırdan (Zend_Db_Table_Row_Abstract) nesneler birden fazla modeli oluşturmaktır.

The relationship is simple: an Order has one Customer (foreign key order_custid=customer.cust_id); a Customer has many Orders.

Emir yükleniyor yeterince kolaydır. Yöntem, burada belgelenmiştir kullanımı:

http://stackoverflow.com/questions/638622/modeling-objects-with-multiple-table-relationships-in-zend-framework

... Sonra her biri için müşteri kapmak olabilir.


    foreach ($orderList as $o)
    {
        cust = $o->findParentRow('Customers');
        print_r ($cust); // works as expected.
    }

Eğer emir uzun bir liste yükleme bittiğinde - ama demek, 40 veya daha fazla, bir pageful - Bu acı yavaş.

Sonraki Bir JOIN çalıştı:


    $custTable = new Customers();
    $orderTable = new Orders();
    $orderQuery = $orderTable->select()
        ->setIntegrityCheck(false) // allows joins
        ->from($orderTable)
        ->join('customers', 'cust_id=order_custid')
        ->where("order_status=?", 1); //incoming orders only.
    $orders = $orderTable->fetchAll($orderQuery);

Bu bana emir nesneleri bir dizi verir. print_r($orders) Bunların her biri ben ham alan adları Order_ * ve cust_ * ile korunan bir üyesi, bekliyoruz sütun listesi içerdiğini gösterir.

Ama nasıl bu al nesnelerin her birini bulmak cust_ * alanlarından Müşteri nesnesi oluşturmak için?


foreach ($orders as $o) {
    $cols = $o->toArray();
    print_r ($cols); // looks good, has cust_* fields...

    $cust = new Customer(array( 'table' => 'Customer', 'data' => $cols ) );
    // fails - $cust->id, $cust->firstname, etc are empty

    $cust->setFromArray($cols);
    // complains about unknown 'order_' fields.

}

Katıldı satırları aynı anda bir Sipariş ve Müşteri nesne oluşturmak için iyi bir yolu var mı? Veya bir çiğ sonuç kümesi olsun ve alanları tek-tek yeni oluşturulan nesnelerin içine her kopya, tablo geçidi olmadan sorguyu çalıştırmak gerekir?

2 Cevap

Zend_Db bunu yapmak için kolaylık yöntemleri sağlamaz.

Varsayımsal, birden çok tablodan elde satırlar için Facade desen kullanmak için şık olurdu. Cephe sınıfı sütunları ilgili her masaya ait olan takip ediyorum. Tek bir alanı veya setFromArray() yöntemiyle alanların bir sürü ayarladığınızda, cephe her tablo için Satır nesnelere alanları harita, ve UPDATE ifadeleri nasıl uygulanacağını bilmek istiyorum tablo (lar) etkiledi.

Alternatif olarak, Zend_Db_Table_Row_Abstract, yerine sessizce istisna atma bilinmiyor sütunları görmezden __set() davranışını değiştirerek sınıflara bilinmeyen alanları soruna olabilir.

SQL yapabileceği her şeyi yapmak için bir OO arayüze sahip olamaz. Ortak durumlarda makul bir set kaplanmıştır, ve her şey daha karmaşık SQL ile yapılmalıdır karar kuma bazı satır olmalıdır.

Ben nesneleri veritabanı satır alanları atamak için bu yöntemi kullanın. Ben setter yöntemleri kullanın, ama bu belki de nesne üzerinde sadece özellikleri ile yapılabilir.

public function setOptions(array $options){
    $methods = get_class_methods($this);
    foreach ($options as $key => $value) {
        $method = 'set' . ucfirst($key);
        if (in_array($method, $methods)) {
            $this->$method($value);
        }
   }
   return $this;
}