Quelle est la manière la plus durable d'obtenir des informations agrégées sur les champs?


12

EntityFieldQuery n'est pas destiné à être utilisé pour exécuter des fonctions d'agrégation (SUM, AVG, etc.) sur les données de champ car il est indépendant de SQL. Cela dit, ces opérations doivent légitimement être menées de temps à autre. Selon la fonction SQL avec EntityFieldQuery et en particulier EntityFieldQuery et comment utiliser les fonctions d'agrégation SUM, ARG et MAX , les requêtes SQL doivent être utilisées, et cette approche convient le mieux à mon cas d'utilisation. Hier, je parlais avec @chx et il a recommandé d'utiliser quelques fonctions internes pour trouver le nom du champ et le nom de la colonne. Je me demande simplement si cela est durable et s'il est approprié de le faire dans une base de code que je pourrais publier à otehrs.

Si c'est la meilleure façon, alors c'est la meilleure façon. Je ne veux tout simplement pas le faire avant d'en être absolument sûr parce que c'est désordonné.


Pour l'instant, je viens d'utiliser les fonctions internes ( _field_sql_storage_tablename($field)et _field_sql_storage_columnname($field_name, $column), ce qui convient à mes besoins actuels, mais ce n'est pas durable, donc toujours intéressé par une réponse à cette question si elle venait.
wizonesolutions

Réponses:


2

Le module Champ de vue vous permet d'exposer des tables de champ en tant que tables de base aux vues. Cela diffère du comportement par défaut de Views dans la mesure où la table de base est la table de champ et non une entité à partir de laquelle les données de champ sont ensuite chargées. Par exemple, lorsque vous sélectionnez un nœud en tant que table de base, vous pouvez ensuite ajouter des champs, mais le principal (table de base) dans la requête est toujours un nœud qui, selon vos données, peut gâcher les fonctions d'agrégation (aka une relation plusieurs-à-un de certains champs au nœud).

Le champ Vues vous permet d'accéder directement aux tables de champ, ce qui signifie que les fonctions d'agrégation fonctionnent correctement. De plus, si vous avez besoin de faire des jointures "intéressantes" à d'autres tables de champs, vous pouvez les contrôler complètement en utilisant ce qui suit.

/**
 * Implements hook_views_data_alter().
 */
function mymodule_views_data_alter(&$data) {
  views_field_add_multi_join($data, /* see docs */);
}

Ce qui est assez simple à utiliser et vous permet ensuite d'exécuter des fonctions d'agrégation sur plusieurs tables de champ à la fois. Vous pouvez ensuite appeler manuellement une vue $view->execute()et retirer les résultats de la vue. Il existe des exemples de cela dans la documentation des vues.

Les avantages de cette approche par rapport à EntityFieldQuery sont que vous pouvez gérer le processus dans les vues (que presque tout le monde utilisera déjà) et lui permettre d'effectuer la construction de la requête physique de manière moins directe, ce qui contribue à augmenter les bris possibles sur la route. De plus, plusieurs fois, vous souhaiterez afficher ces données agrégées sur un écran d'administration que vous pouvez ensuite utiliser la vue pour fournir à la fois un affichage et accéder aux résultats dans le code à des fins supplémentaires.


Je vais devoir vérifier cela. Je pourrais échanger ce code dans mes champs calculés au lieu de faire la requête manuellement. Je vais probablement travailler sur le site où j'en ai besoin bientôt et je ferai rapport à un moment donné. Si ça marche, j'accepte.
wizonesolutions

0

Cela pourrait-il être fait dans un module complémentaire aux vues? Il gère très bien les requêtes et certains résultats sont publiés avec des fonctions d'agrégation telles que dans les actions lorsque les filtres contextuels échouent, où il peut par défaut toutes les valeurs et donner des comptes sur les résultats disponibles dans chacune. Les fonctions pour les requêtes devraient être là mais un formulaire d'interface utilisateur serait nécessaire pour cela. Faites-moi savoir si cela a du sens. Je commence à peine à disséquer les opinions et à spéculer.


COUNT requêtes peuvent être exécutées sur des entités, donc cela est résolu. Je suis plus intéressé par SUM moi-même. views_calc peut fournir des informations, mais je veux utiliser la valeur dans un champ calculé ... ce que je pourrais bien faire avec views_get_view_result (ou similaire). Cependant, obtenir les vues pour générer cette requête en premier lieu est l'astuce. Il semble que la méthode hackish soit la meilleure. Je suppose que je vais commencer par ça parce que si je ne le libère pas, je serai en or. Si je le fais, quelqu'un, je l'espère, soumettra un patch.
wizonesolutions
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.