Zend Framework Select Objects And BİRLİĞİ ()

6 Cevap php

(Ben, dokümantasyon ve sorun izci Web'de arama var) bu Zend Framework mümkün değildir eminim ama ben sadece bu yüzden ben burada soruyorum emin olmak istiyorum.

$select = $this->select();
$select->union($select1, $select2);

Bu tabii ki çalışmaz. Ben ne gerek açıklamak için. Ben bir SELECT sorgusu 2 tabloları birleştirmek için UNION () kullanmanız gerekir, ben sadece yapabileceğini biliyorum:

$select = "$select1 UNION $select2";

Sorun şu ki, bir dize dönecekti ve ben Zend_Paginator ile kullanabilirsiniz böylece seçkin bir nesne almak gerekiyor.

Ben zaten benim veritabanı mimarisi değiştirerek sorunu çözmüş ama bunun için bazı çözüm olup olmadığını merak ettim.

6 Cevap

Zend_Db_Select has a union method bu yüzden ben size bir seçme nesnesi kullanarak sorgu oluşturmak eğer bu mümkün sanırdım. Ben sendika ile Zend_Db_Select (veya tablo alt sınıfı) kullanılır değil ama ben böyle bir şey yapabilirsiniz hayal ediyorum

$select = $this->select()
               ->where('blah')
               ->union($sql);

Burada bir birlik olmak için yaptık ne:

$select = $this->select();
//common select from both sides of the union goes here

$select1 = clone($select);
//select1 specifics here

$select2 = clone($select);
//select 2 specifics here

$db = $this->getAdapter();
$pageselect = $db->select()->union(array("($select1)", "($select2)"));

Db_Select 's __toString size hata ayıklama yardımcı olmak için, seçeneğini tarafından oluşturulan SQL yazdırmak hatırlıyorum.

Tam bir örneği:

 public function getReservationById($id)
 {
  if(!$id) return null;

  $sql = $this->table->select();
  $sql->union(array(
   $this->table->select()->where('id=?', $id),
   $this->tableFinished->select()->where('id=?', $id),
   $this->tableCanceled->select()->where('id=?', $id),
   $this->tableTrashed->select()->where('id=?', $id)
   ));
  echo $sql->__toString();
 }

ve oluşturulan sorgu:

reservations SEÇ. * reservations WHERE (id = '5658 ') UNION SELECT res_finished. * DAN res_finished WHERE (id =' DAN 5658 ') UNION SELECT res_cancel. * res_cancel WHERE (id = '5658 DAN' union select) res_trash. * DAN res_trash NEREDE (id = '5658 ')

Bu pratik örnek, son veya belirli bir yıl (sanat blog) bir mevcut favori Blog girişleri ise ya bir satır kümesi döndüren bir işlevi gösterir:

public function fetchBestOf($year)
{
    $selectLatest = $this->select()->where('isHidden = 0')
                                   ->where('YEAR(dateCreated) = ' . $year)
                                   ->where('isHighlight = 0');
    $selectHighlights = $this->select()->where('isHidden = 0')
                                       ->where('YEAR(dateCreated) = ' . $year)
                                       ->where('isHighlight = 1');

    $selectUnion = $this->select()->union(array($selectLatest, $selectHighlights), Zend_Db_Select::SQL_UNION_ALL)
                   ->order('isHighlight DESC')
                   ->order('dateCreated DESC')
                   ->order('workID DESC')
                   ->limit('5');

    $rowset = $this->fetchAll($selectUnion);
    return $rowset;
}

Bu benim için nasıl işliyor:

$select1 = $this->select();               
$select2 = $this->select();

Her iki sorguda gerekli verileri aldıktan sonra BİRLİĞİ sözdizimi şöyle:

 $select = $this->select()->union(array('('.$select1.')', '('.$select2.')'));  

Aşağıdaki gibi Zend önermek en iyi yoldur ....

$sql = $this->_db->select()
    ->union(array($select1, $select2,$select3))
            ->order('by_someorder');

echo $sql->__toString();

$stmt = $db->query($sql);
$result = $stmt->fetchAll();

echo sorgu gösterecektir

Here $select1, $select2, $select3 can be different select queries with same number of columns...