2009-08-23 6 views
4

Je suis assez sûr que ce n'est pas possible dans Zend Framework (j'ai cherché sur le Web, la documentation et le suivi des problèmes) mais je veux juste m'assurer que je demande ici.Zend Framework Sélectionner des objets et UNION()

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

Cela ne fonctionne pas bien sûr. Pour expliquer ce dont j'ai besoin. Je dois utiliser UNION() pour fusionner 2 tables dans une requête SELECT, je sais que je pouvais faire:

$select = "$select1 UNION $select2"; 

Le problème est que renverrait une chaîne et je dois obtenir un objet de sélection afin que je puisse utiliser avec Zend_Paginator.

J'ai déjà résolu le problème en modifiant mon architecture de base de données, mais je suis juste curieux de savoir s'il existe une solution de contournement pour cela.

Répondre

7

Zend_Db_Select has a union method donc j'aurais pensé que c'est possible, si vous pouvez construire votre requête en utilisant un objet select. Je ne l'ai pas utilisé Zend_Db_Select (ou la sous-classe de table) avec le syndicat, mais j'imagine que vous pouvez faire quelque chose comme

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

Dans mon expérience, cela ne fonctionne pas dans ZF 1.7 ... – NDM

+0

@Nicky Vous avez un extrait de code qui ne fonctionne pas? –

12

Voici ce que je l'ai fait pour faire une union:

$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)")); 

Rappelez-vous Db_Select__toString va imprimer le SQL généré par cette sélection, pour vous aider à déboguer.

4

un exemple complet:

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(); 
} 

et la requête générée:..

SELECT reservations * FROM reservations WHERE (id = '5658') UNION SELECT res_finished * FROM res_finished WHERE (id = » 5658 ') UNION SELECT res_cancel. * FROM res_cancel WHERE (id =' 5658 ') UNION SELECT res_trash. * FROM res_trash WHERE (id =' 5658')

3

Cet exemple pratique montre une fonction qui renvoie un ensemble de lignes soit plus tard ou si une des entrées de blog disponibles préférées d'une année donnée (blog d'oeuvre):

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; 
} 
2

La meilleure façon Zend Suggest est comme suit ... .

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

echo $sql->__toString(); 

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

écho montrera la requête

ici select1 $, select2 $, Sélection3 $ peut b e différentes requêtes de sélection avec le même nombre de colonnes ...

1

Voici comment cela fonctionne pour moi:

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

Après avoir obtenu les données nécessaires dans les deux requêtes la syntaxe UNION va comme ceci:

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