Bir Doktrin select deyiminde bir 'zaman' olgusunu kullanarak

4 Cevap php

Ben Doktrini ile gerçekleştirmek istediğiniz bir seçme sorgusu vardır:

 $resultset = Doctrine_Query::create()
    ->select("t.code, t.description, case when t.id_outcome = 1 then 1 else 0 end as in_progress")
    ->from('LuOutcome t')
    ->orderBy('t.rank')
    ->fetchArray();

Ve bu 'durum' hakkında barfs. Dokümantasyon mümkün (ya da değil) olduğunu söz etmez.

Doktrin bunu kapasitesinden yoksun merak ediyorum. Eğer öyleyse, bu oldukça büyük bir ihmal var. Herkes bir işin etrafında biliyor mu?

4 Cevap

Burada aynı problem vardı. Benim proje çok eski olduğunu ve hızlı bir şekilde bunu düzeltmek için çalıştı. Yani sadece bu yüzden "zaman davayı" kullanabilirsiniz biraz Doktrini için kodunu değiştirmek. Bu Doktrin 1.1.3 için benim kodudur.

658-674 Doktrini / Query.php, değişim hatları:

        if (count($terms) > 1 || $pos !== false) {
            if($terms[0]=='case')
            {
                $terms=explode(" as ", $reference);
                $expression = array_shift($terms);
                $alias = array_pop($terms);

                if ( ! $alias) {
                    $alias = substr($expression, 0, $pos);
                }

                $componentAlias = $this->getExpressionOwner($expression);

                $tableAlias = $this->getTableAlias($componentAlias);

                $expression=str_replace($componentAlias, $tableAlias, $expression);

                $index=0;

                $sqlAlias = $tableAlias . '__' . $alias;
            }
            else
            {
                $expression = array_shift($terms);
                $alias = array_pop($terms);

                if ( ! $alias) {
                    $alias = substr($expression, 0, $pos);
                }

                $componentAlias = $this->getExpressionOwner($expression);
                $expression = $this->parseClause($expression);

                $tableAlias = $this->getTableAlias($componentAlias);

                $index    = count($this->_aggregateAliasMap);

                $sqlAlias = $this->_conn->quoteIdentifier($tableAlias . '__' . $index);
            }

            $this->_sqlParts['select'][] = $expression . ' AS ' . $sqlAlias;

Bu büyük bir değişiklik değil, ama o bana yardımcı oldu ...

Ben sadece ilk bakışta, bir geçici çözüm var görünüyor, aynı sorunu vardı ve. Ben parantez içinde sararak bir alt sorgu olarak tedavisinde içine Doktrini Seç ayrıştırıcı 'aptal' inanıyorum.

Bu bir deneyin:

$resultset = Doctrine_Query::create()
->select("t.code, t.description, (case when t.id_outcome = 1 then 1 else 0 end) as in_progress")
->from('LuOutcome t')
->orderBy('t.rank')
->fetchArray();

BNF grammar for the Doctrine Query Language bir CASE yapısıyla ilgili bir şey içermez görünmüyor.

Ben bu sorunu çözmek için CASE sözdizimi kullanmamanızı tavsiye ederiz. Bu zor görünüyor.

Neden istemiyorsun

$resultset = Doctrine_Query::create()
    ->select("t.code, t.description, t.id_outcome")
    ->from('LuOutcome t')
    ->orderBy('t.rank')
    ->fetchArray();

ve daha sonra $ resultset'de döngü ve bu alanı (in_progress) oluşturmak manuel (id_outcome) değerine bağlı. Bunun için bazı küçük basit küçük bir yöntemi kullanabilirsiniz.

Yararları:

  • basit
  • okunabilir