2012-06-10 17 views
5

Birkaç web uygulaması projesinde Symfony ile Doctrine kullanıyorum.Hangi alanın dokümanın sorgulandığını belirleme Doktrin

Veritabanından ihtiyaç duyulan alanları seçmek için bu projelerdeki birçok sorguyu optimize ettim. Ancak zamanla yeni özellikler eklendi ve - birkaç durumda - kodda ek alanlar kullanılıyordu, bu da Doktrini tembel yükleyicinin veritabanını yeniden sorgulamasına ve bazı sayfalardaki sorgu sayısını 3'ten 100+

'a çevirmesine neden oldu

Tüm zorunlu alanları içerecek şekilde özgün sorguyu güncellemem gerekiyor. Ancak, Doctrine'nin hangi alanın ek sorguya yol açacağını kaydetmesi için kolay bir yol yoktur - bu nedenle orijinal sorguda olmayan alanların kullanımını arayan kodları taramak için özenli bir iş haline gelir.

Bir alıcı, nemlendirilmemiş bir alana eriştiğinde Doktrin günlüğüne sahip olmanın bir yolu var mı?

cevap

1

Bu sorunla karşılaşmadım, ancak sadece Doctrine_Record sınıfına baktım. _get() yöntemine bazı hata ayıklama çıkışı eklemeyi denediniz mi?

if (array_key_exists($fieldName, $this->_data)) { 
     // check if the value is the Doctrine_Null object located in self::$_null) 
     if ($this->_data[$fieldName] === self::$_null && $load) { 
      $this->load(); 
     } 
+0

Bu aldığım sona erdi rota Doctrine_EventListener genişleten bir sınıf oluşturmak. –

1

Sadece SQL günlüğünü etkinleştirmek ve takma adlarından suçluyu çıkarabiliriz: Bu bölüm bir çözüm aramak gerekir nerede olduğunu düşünüyorum. Doctrine 1.2'de nasıl yapılacağı için bu post'a bakın. Temelde

: Olay dinleyicisi

class QueryDebuggerListener extends Doctrine_EventListener 
{ 
    protected $queries; 

    public function preStmtExecute(Doctrine_Event $event) 
    { 
     $query = $event->getQuery(); 
     $params = $event->getParams(); 

     //the below makes some naive assumptions about the queries being logged 
     while (sizeof($params) > 0) { 
      $param = array_shift($params); 

      if (!is_numeric($param)) { 
       $param = sprintf("'%s'", $param); 
      } 

      $query = substr_replace($query, $param, strpos($query, '?'), 1); 
     } 

     $this->queries[] = $query; 
    } 

    public function getQueries() 
    { 
     return $this->queries; 
    } 
} 

Ve ekleyin:

$c = Doctrine_Manager::connection($conn); 
$queryDbg = new QueryDebuggerListener(); 
$c->addListener($queryDbg); 
+0

Bu Doctrine2 içindir. OP kullanımı Doktrini 1. – j0k

İlgili konular