2010-11-14 32 views
4

Donc, nous savons tous que la documentation pour Kohana 3 est absolument horrible. Alors, comment puis-je construire la requête suivante, où j'ai un modèle "Player" et "Dragon"?Kohana 3 ORM: requêtes avancées, efficacité

SELECT * FROM `dragons` JOIN `players` ON (`dragons`.`player_id` = `players`.`player_id`) WHERE `uid` IN (1,2,3) ORDER BY `dragons`.`id` ASC 

Je peux utiliser ORM::factory('dragon')->join("players")->on("dragons.player_id", "=", "players.player_id") pour se rendre à la rejoindre une partie, mais je ne peux pas la clause in. Il n'y a pas de fonction in dans l'ORM de Kohana 3. J'ai essayé la fonction where, mais il met des citations autour du troisième paramètre, donc ma liste d'ID devient une chaîne et la requête devient invalide. Alors qu'est-ce que je peux faire? Je ne peux pas comprendre comment ajouter des morceaux personnalisés de SQL à mes requêtes de chargement ORM. Encore une fois, parce que la documentation n'existe pas. La seule façon dont je peux penser maintenant est de simplement charger tous les joueurs appropriés, les boucler et récupérer leurs dragons. Mais cela semble vraiment stupide - beaucoup plus de requêtes que nécessaire. Je me suis senti comme ça avant, que l'utilisation d'ORM rend les choses horriblement inefficaces à la fin de l'interrogation, afin de le rendre un peu plus facile à coder. Est-ce vrai?

Répondre

6

ORM peut produire des requêtes moins que désirables - mais cela accélère aussi le temps de développement et vous donne une abstraction (certaines personnes pensent qu'elles ne devraient plus jamais écrire SQL à la main).

La plupart du temps, je préfère SQL dans les applications Web complexes. Cependant, en disant cela, ce que vous voulez est possible en utilisant ORM de Kohana 3.


De The Pixel Developer.

where('field', 'IN', range(1, 3)); 

Ceci a l'avantage de ne pas avoir la boucle. :-)

+0

@Le développeur Pixel: oui, c'est possible – zerkms

+1

@The Pixel Developer Vous avez transformé ma réponse médiocre en un bon - merci! – alex

+1

Pas de problème alex. Ne vaut pas vraiment sa propre réponse pour 3 lignes et puisque vous avez déjà fait la plupart du travail, je pensais qu'il serait préférable d'améliorer le vôtre :) –