2009-09-21 9 views
4

Je suis nouveau à zend. On m'a demandé de redévelopper un site web qui était écrit en PHP et de le mettre dans le framework zend. Je rencontre beaucoup de problèmes avec les relations de base de données, je n'arrive pas à comprendre et à interroger les relations.zend relations avec select

Je voudrais trouver une catégorie. A partir de cette catégorie, j'aimerais pouvoir trouver tous les CategoryInfo qui lui sont associés, et pouvoir interroger/trier/limiter cet ensemble de données.

Voici mes modèles.

Categorys.php

<?php 
    class Default_Model_Categorys extends Zend_Db_Table_Abstract 
    { 
     protected $_name = 'Categorys'; 
     protected $_primary = 'id'; 

     protected $_dependentTables = array('Default_Model_CategoryInfo'); 
} 
?> 

CategoryInfo.php

<?php 
class Default_Model_CategoryInfo extends Zend_Db_Table_Abstract 
{ 
    protected $_name = 'Category_Info'; 
    protected $_primary = 'id'; 

    protected $_referenceMap = array(
     'Categorys' => array(
      'columns' => array('cat_id'), 
      'refTableClass' => 'Default_Model_Categorys', 
      'refColumns' => array('id') 
     ) 
    ); 
} 
?> 

CategoryController.php

<?php 
    class CategorysController extends Zend_Controller_Action 
    { 
     public function indexAction() 
     { 
     /* 
      this should redirect to all games 
     */ 
      return $this->_forward("index", "games"); 
     } 

     public function categoryAction() 
     { 
      /* 
      shows a specific category 
      */ 
      $id = (int) $this->_request->getParam('id'); 
      $category = new Default_Model_Categorys(); 
      $this->view->category = $category->fetchRow(
       $category->select()->where('id = ?', $id) 
     ); 

      $categoryInfo = $this->view->category->findDependentRowset('Default_Model_CategoryInfo'); 

     } 
    } 

... Tout d'abord que je fais quelque chose de mal?

Deuxièmement ... comment procéder pour interroger le jeu de lignes dépendant?

Répondre

2

Tout d'abord, si vous êtes à la recherche d'une catégorie par sa clé primaire, il est plus simple d'utiliser la méthode find():

$id = (int) $this->_request->getParam('id'); 
$category = new Default_Model_Categorys(); 
$this->view->category = $category->find($id)->current(); 

En second lieu, de restreindre ou de trier Category_Info dépendants des lignes, vous pouvez utiliser un objet Zend_Db_Table_Select en tant que paramètre facultatif de findDependentRowset(). Voici un exemple:

$select = $category->select()->where("info_type = 'PRICE'") 
          ->order("info_date") 
          ->limit(3); 
$categoryInfo = $this->view->category->findDependentRowset(
    'Default_Model_CategoryInfo', null, $select); 

Notez que vous pouvez utiliser n'importe quel objet table pour créer cet objet select. Depuis la « FROM » clause pour cette sélection sera définie par la méthode findDependentRowset(), vous ajoutez simplement d'autres clauses et passez ensuite dans

PS:. Vous ne pouvez pas déclarer $_dependentTables du tout, à moins que vous allez utiliser la mise à jour en cascade ou la suppression en cascade via le code PHP. Je recommande fortement contre en faisant cela - il est beaucoup plus efficace de laisser le SGBDR gérer ces opérations en cascade. De même, vous ne devriez jamais avoir à déclarer $_primary si les tables de votre base de données déclarent réellement des contraintes de clé primaire. Zend_Db_Table_Abstract sait comment inspecter les métadonnées pour obtenir les colonnes de clé primaire.

+0

Fais-toi un héros. Je te remercie! Problème résolu. – sfusion

+0

Content de vous aider! J'ai édité le ci-dessus pour ajouter l'appel 'current()' car 'find()' renvoie toujours un ensemble de lignes, pas une seule ligne. –

0

Tout me semble correct. Vous n'interrogez pas un ensemble de lignes dépendant. C'est une requête elle-même et elle renvoie un ensemble de résultats. Fondamentalement, ce qu'il fait est de tirer tous les enregistrements liés à la ligne en cours avec laquelle vous travaillez, tel que défini par $ _referenceMap. Une fois que vous exécutez findDependentRowset(), vous pouvez foreach sur les résultats qui vous donnera des instances de Zend_Db_Table_Row. De là, vous pouvez afficher les données connexes au besoin.

Personnellement, je n'utilise pas les relations Zend_Db. Il est beaucoup plus facile de simplement faire une seconde méthode de modèle pour interroger ce dont j'ai besoin. En outre, les relations Zend_Db ne prennent pas en charge les clauses , de sorte que la création d'une deuxième requête est beaucoup plus flexible que les relations.

Questions connexes