Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 20-04-2007 10:32:07

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

[Zend_Db][0.9.1] Requetes et objet

Bonjour, je début avec le ZF et je pense ne pas faire comme il faut au niveau des requetes.
En gros je veux faire un blog pour m'exercer.

J'ai 4 tables

Billet (id, title, content,date, user_id, category_id)
Categories(id, name)
Users(id, login,password, mail)
Tags(id,name)
Taggings(id,taggable_type,taggable_id,tag_id)

Quand je veux récuoérer tous les billets j'appel depuis mon controlleur recupToutBillet()

Code:

MODEL BILLET
function recupToutBillet($idUser,$category = null){
  $select = Zend_registry::get('db')->select();
  $select->from('billet',array('billet.id','billet.title','billet.content','billet.date','billet.category_id'));
  $select->joinLeft('users', 'users.id = billet.user_id','users.login')
            ->joinLeft('categories', 'categories.id = billet.category_id','categories.name');
  $select->where("billet.user_id='".$idUser."'".($category?" AND billet.category_id=".$category:""));
  $select->order("billet.date DESC");
  $sql     = $select->__toString();
  $result = Zend_registry::get('db')->fetchAll($sql);
  if($result){
        $tags         = new Taggings();
    foreach($result as $key => $value){
        $result[$key]['tags']     = $tags->getTags("billet",$result[$key]['id']);
    }
    return $result;        
  }
}

MODEL TAGGINGS
function getTags($taggable_type, $taggable_id){
        $select = Zend_registry::get('db')->select()
                ->from('taggings', '*')
                ->joinLeft('tags', 'tags.id = taggings.tag_id', 'tags.name')
                ->where("taggable_id='".$taggable_id."' and taggable_type='".$taggable_type."'");
        $sql     = $select->__toString();
        $tags     = Zend_registry::get('db')->fetchAll($sql);
        return $tags;    
    }

Le problème c'est que ca me parait bien complexe et le framework ne m'apporte pas grand chose dans l'affaire, je pense avoir loupé un épisode. Quel est la meilleure façon de faire ? merci d'avance pour votre aide.

Hors ligne

 

#2 20-04-2007 10:53:15

stephane
Membre
Lieu: Biot
Date d'inscription: 26-03-2007
Messages: 33
Site web

Re: [Zend_Db][0.9.1] Requetes et objet

C'est sûr qu'en utilisant la couche d'abstraction, cela devient vite illisible. Mais en attendant un meilleur support d'Active Record, tu peux simplement construire les requêtes à la main :

Code:

/**
 * Finds all the countries available.
 * 
 * @return array the list of timezones
 */
public static function findAll() {
  // Retrieves database handler
  $db = Zend_Registry::get("database");
  
  // Retrieves locale of the system
  $locale = ServiceFactory::getLocale()->getLocale();
  
  // Retrieves language from locale
  $language = $locale->getLanguage();
  
  // Sets up the query
  $sql = "SELECT countries.id, alpha2, name "
       . "FROM countries, countries_localized "
       . "WHERE countries.id = countries_localized.id "
         . $db->quoteInto("AND language = ? ", $language)
       . "ORDER BY name ASC";
  
  // Executes the query
  $result = $db->query($sql);
  
  // Fetchs results
  return $result->fetchAll();
}

Comme tu peux le voir, cela ne t'empêche pas de passer des paramètres à ta requête.

Je suis assez septique vis-à-vis de cette fameuse couche d'abstraction, car le principal intérêt avancé est de pouvoir s'affranchir du type de base de données utilisé. Cela te permet donc de passer par exemple de MySQL à Oracle sans avoir à modifier le code de tes requêtes. Dans la pratique, ça n'arrive jamais. Cela peut être intéressant aussi pour la personne qui ne connaît pas le langage SQL. Mais il vaut mieux faire l'effort de l'apprendre sinon comment feras-tu le jour où tu travailleras sur un autre projet qui n'utilise pas Zend Framework ?

Hors ligne

 

#3 20-04-2007 10:57:01

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: [Zend_Db][0.9.1] Requetes et objet

Bonjour Toimême,

si tu débutes avec ZF, je te conseille ces adresses :

http://www.kitpages.fr/
http://www.zftutorials.com/
http://framework.zend.com/wiki/display/ZFDEV/Tutorial


Certes, c'est un peu touffu, mais crois moi, tu galères pendant trois jours pleins et tu auras fait un (trés) grand pas en avant.

Bon courage,

fred

P.S : tu trouveras un bon tutos pour faire un blog

Hors ligne

 

#4 20-04-2007 11:13:35

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Zend_Db][0.9.1] Requetes et objet

La couche d'abstraction a quand même un avantage non négligeable, elle te protège à la base contre les injections SQL (une injection SQL est un gars qui envoie un paramètre bizarre dans un formulaire, si ce paramètre n'est pas correctement traité avant d'être envoyé dans ta requette, le gars peut modifier ta base de données dans ton dos...).
C'est quand même un avantage majeur. Sinon c'est plus lourd... on ne peut pas dire le contraire smile
Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#5 20-04-2007 11:25:11

stephane
Membre
Lieu: Biot
Date d'inscription: 26-03-2007
Messages: 33
Site web

Re: [Zend_Db][0.9.1] Requetes et objet

Il me semblait que l'utilisation de la méthode quoteInto() (comme dans mon exemple) permettait d'éviter ce problème, mais il est vrai que je n'ai pas regardé le code source de cette méthode pour m'en assurer.

Hors ligne

 

#6 20-04-2007 14:51:57

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [Zend_Db][0.9.1] Requetes et objet

humm en gros y' a pas beaucoup mieux que ce que j'ai fait sad
Donc en effet coté active record c'est pas terrible.
Bon be je vais faire avec , merci pour votre aide.

Hors ligne

 

#7 20-04-2007 16:12:06

fred wolf
Administrateur
Lieu: Bordeaux
Date d'inscription: 09-04-2007
Messages: 96

Re: [Zend_Db][0.9.1] Requetes et objet

Je pense que si, je ne l'ai pas testé mais il me semble qu'un gros effort a déjà été fait dans la version 0.92. Il y a du mapping entre les tables, de la suppression ou maj en cascade.
Si tu veux approfondir le sujet je crois que tu devrais creuser de ce côté là. Jette un coup d'oeil dans la doc je crois qu'elle est à jour.

http://framework.zend.com/manual/en/zen … ships.html

fred

Hors ligne

 

#8 20-04-2007 17:32:20

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Db][0.9.1] Requetes et objet

Oui je confirme car je l'utilise et j'expérimente des structures (http://www.z-f.fr/forum/viewtopic.php?id=93).

Pour moi la couche ORM est déjà bien avancée, j'avoue que j'écris rarement des requêtes, tout est géré par l'ORM.
Mon tutoriel pourra peut-être aider

Par exemple un '$unBillet->findParentMembresByAuteur()' va générer de lui-même tout le SQL ( jointures comprises ) sous entendu pour récupérer un résultat membre, ayant écrit le billet <Object>$unBillet.

Cette écriture est très proche de RubyOnRails, pour les adeptes ^^

Hors ligne

 

#9 20-04-2007 18:07:01

Moimeme
Membre
Date d'inscription: 19-04-2007
Messages: 120

Re: [Zend_Db][0.9.1] Requetes et objet

oui je connais un peu ROR mais la je vois pas trop comment je peux faire.
En théorie si j'utilise les relations dans ZF est ce que si j'utilise un findByUser($idUser) sur mon model billet il me retournera l'equivalent de mon recupToutBillet ? si j'ai fait les relations vers users, catégories et vers la table d'asso tags.
J'avous je vois pas comment coder proprement mon exemple en ORM avec ZF.
Je vais essayer de gratter mais toute aide sera la bienvenue smile

Dernière modification par Moimeme (20-04-2007 18:09:04)

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages