Requête UNION avec codeigniter du modèle d'enregistrement active
Comment faire une requête UNION avec PHP CodeIgniter framework actif de la requête d'enregistrement format?
Vous devez vous connecter pour publier un commentaire.
Comment faire une requête UNION avec PHP CodeIgniter framework actif de la requête d'enregistrement format?
Vous devez vous connecter pour publier un commentaire.
CodeIgniter est ActiveRecord n'a pas le soutien de l'UNION, de sorte que vous suffit d'écrire votre requête et d'utiliser le ActiveRecord de la méthode de requête.
C'est un moyen rapide et sale méthode une fois, j'ai utilisé
Pas mon meilleur travail, mais il a résolu mon problème.
remarque: je n'ai pas besoin de commander le résultat.
En faisant de l'union à l'aide de last_query(), elle peut entraver les performances de l'application. Parce que pour la seule union, il pourrait avoir besoin pour exécuter des 3 requêtes. j'.e pour le "n" de l'union "n+1" requêtes. Il n'aura pas beaucoup d'effet pour 1-2 requête union. Mais il donnera problème si l'union de nombreuses requêtes ou des tables ayant de gros volumes de données.
Ce lien vous aidera beaucoup: enregistrement actif sous-requêtes
Nous pouvons combiner l'enregistrement actif avec le manuel des requêtes.
Exemple:
$query = $this->db->get();
? $query ne semble pas à utiliser n'importe où dans le code.Vous pouvez utiliser la méthode suivante pour obtenir l'instruction SQL dans le modèle:
De cette façon, l'instruction SQL seront de l'ordre de sous-requête variable, sans réellement l'exécuter.
Vous avez posé cette question il y a longtemps, alors peut-être vous avez déjà eu la réponse. si pas, ce processus peut faire l'affaire.
_compile_select()
est une méthode protégée dans la dernière version de CodeIgniter (le trait de soulignement indique qu'il a été conçu comme une méthode interne en premier lieu). Voir ma réponse pour une solution de contournement: stackoverflow.com/a/14270008/560114par la modification de somnath huluks réponse, j'ai ajouter ces variables et les fonctions de DB_Active_rec classe comme suit:
par conséquent, vous pouvez pratiquement utiliser des syndicats sans dépendances à db_driver.
d'utiliser de l'union avec cette méthode, il vous suffit de faire régulièrement des actifs de requêtes d'enregistrement, mais en l'appelant union_push au lieu de les obtenir.
remarque: vous devez vous assurer que vos requêtes de faire correspondre les colonnes à l'instar des syndicats
exemple:
donnerait:
J'ai trouvé cette bibliothèque, qui fonctionnait bien pour moi, pour ajouter de l'UNION dans un ActiveRecord style:
https://github.com/NTICompass/CodeIgniter-Subqueries
MAIS j'ai eu à prendre la
get_compiled_select()
méthode de la branche dev de CodeIgniter d'abord (disponible ici: https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/DB_query_builder.php -- DB_query_builder remplacera DB_active_rec). Sans doute cette méthode sera disponible dans une future version de production de CodeIgniter.Une fois, j'ai ajouté cette méthode pour DB_active_rec.php dans système/base de données, il a travaillé comme un charme. (Je ne voulais pas utiliser le dev de la version de CodeIgniter que c'est une production de l'app.)
get_compiled_select
méthode dansDB_active_rec.php
fera la bibliothèque fonctionne correctement ? Et faut-il utiliser l'ajout de la méthode pour combiner les résultats ? Je ne vois aucune mention à ce sujet sur le dépôt GitHub de la bibliothèque que vous avez mentionné pour la réalisation de l'UNION. Et il sera de réaliser l'UNION de TOUS ?get_compiled_select
fera le travail de la bibliothèque. Vous n'avez pas besoin d'appeler vous-même, il est appelé en interne par la bibliothèque. Il faitUNION ALL
. Pour utiliserUNION
s vous faites cela:$sub1 = $this->subquery->start_union(); $sub1->select('a')->from('b')->where('c', 'd'); $sub2 = $this->subquery->start_union(); $sub2->select('a2')->from('b2')->where('c2', 'd2'); $this->subquery->end_union(); $query = $this->db->get();
.ORDER BY
est de créer des problèmes. Comment l'écrire avant de start_union ? Le$sub1
de ne pas être initialisé avant que j'ai donc à écrire à l'aide dedb
objet ?SELECT
s dans unUNION
ne peut pas avoir unORDER BY
. Vous pouvez seulement avoir unORDER BY
pour l'ensemble complet des résultats. Ce que je voulais dire par "avantstart_union
" a été d'écrire$this->db->order_by()
avantsub1 = $this->subquery->start_union();
, car il y a peut être des erreurs de syntaxe si vous l'écrire après. Je suis en train de travailler sur ça.essayer celui-ci
C'est la solution que je suis en utilisant:
bwisn la réponse est mieux que tous et fonctionne, mais pas de bonnes performances car il va exécuter des sous-requêtes en premier.
get_compiled_select ne pas exécuter la requête; c'est juste que le compile pour plus tard, donc, est plus rapide
essayez celui -
Voici une solution que j'ai créé: