Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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()
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
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 :
/** * 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
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
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
Philippe
Hors ligne
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
humm en gros y' a pas beaucoup mieux que ce que j'ai fait
Donc en effet coté active record c'est pas terrible.
Bon be je vais faire avec , merci pour votre aide.
Hors ligne
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
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
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
Dernière modification par Moimeme (20-04-2007 18:09:04)
Hors ligne