Apa cara paling berkelanjutan untuk mendapatkan informasi agregat di lapangan?

12

EntityFieldQuery tidak dimaksudkan untuk digunakan untuk menjalankan fungsi agregat (SUM, AVG, dll.) Pada data lapangan karena itu adalah agnostik-SQL. Karena itu, operasi semacam itu secara sah perlu dijalankan dari waktu ke waktu. Menurut fungsi SQL dengan EntityFieldQuery dan terutama EntityFieldQuery dan cara menggunakan fungsi agregat SUM, ARG dan MAX , query SQL perlu digunakan, dan pendekatan yang sesuai dengan kasus penggunaan saya yang terbaik. Saya berbicara dengan @chx kemarin dan dia merekomendasikan menggunakan beberapa fungsi internal untuk menemukan nama bidang dan nama kolom. Saya hanya ingin tahu apakah ini berkelanjutan dan apakah itu tepat untuk dilakukan dalam basis kode yang mungkin saya rilis untuk otehrs.

Jika itu cara terbaik, maka itu cara terbaik. Aku hanya tidak ingin melakukannya sebelum aku benar-benar yakin karena rasanya berantakan.

solusi wizones
sumber
Untuk saat ini, saya baru saja menggunakan fungsi internal ( _field_sql_storage_tablename($field)dan _field_sql_storage_columnname($field_name, $column), yang sesuai dengan kebutuhan saya saat ini, tetapi tidak berkelanjutan, jadi masih tertarik dengan jawaban untuk pertanyaan ini jika seseorang datang.
wizonesolutions

Jawaban:

2

The View bidang modul memungkinkan Anda untuk mengekspos tabel bidang tabel dasar untuk dilihat. Ini berbeda dari perilaku default Views di mana tabel dasar adalah tabel bidang dan bukan entitas yang darinya data lapangan dimuat. Misalnya ketika memilih simpul sebagai tabel dasar Anda kemudian dapat menambahkan bidang, tetapi primer (tabel dasar) dalam kueri masih berupa simpul yang tergantung pada data Anda dapat mengacaukan fungsi agregat (alias hubungan banyak-ke-satu dari beberapa bidang ke simpul).

Bidang tampilan memungkinkan Anda akses langsung ke tabel bidang yang berarti fungsi agregat berfungsi dengan baik. Selain itu jika Anda perlu melakukan "menarik" bergabung ke tabel bidang lain, Anda dapat mengontrol mereka sepenuhnya menggunakan yang berikut ini.

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

Yang cukup mudah digunakan dan memungkinkan Anda untuk kemudian melakukan fungsi agregat di beberapa tabel bidang sekaligus. Anda kemudian dapat secara manual menjalankan tampilan $view->execute()dan menarik hasilnya dari tampilan. Ada contoh ini dalam dokumentasi tampilan.

Manfaat dari pendekatan ini daripada EntityFieldQuery adalah Anda dapat mengelola proses di Views (yang hampir semua orang akan sudah menggunakan) dan memungkinkannya untuk melakukan pembangunan permintaan fisik dengan cara yang tidak langsung yang membantu meningkatkan kemungkinan kerusakan di jalan. Selain itu beberapa kali Anda ingin menampilkan data agregat tersebut pada layar admin yang kemudian dapat Anda gunakan tampilan untuk menyediakan tampilan dan mengakses hasil dalam kode untuk tujuan tambahan.

boombatower
sumber
Saya harus memeriksa ini. Saya bisa menukar kode itu dengan bidang yang saya hitung daripada melakukan kueri secara manual. Saya mungkin akan bekerja di situs tempat saya membutuhkan ini segera dan akan melaporkan kembali di beberapa titik. Jika berhasil, saya akan menerimanya.
wizonesolutions
0

Mungkinkah ini dilakukan dalam modul tambahan untuk dilihat? Ini menangani kueri dengan sangat baik dan beberapa hasil diterbitkan dengan fungsi agregat seperti dalam tindakan ketika filter kontekstual gagal di mana ia dapat default ke semua nilai dan memberikan penghitungan pada hasil yang tersedia di masing-masing. Fungsi untuk kueri harus ada di sana tetapi formulir UI akan diperlukan untuk itu. Beri tahu saya jika ini masuk akal. Saya baru mulai membedah pandangan dan berspekulasi.

Ashlar
sumber
COUNT kueri dapat dijalankan pada entitas, jadi itu dipecahkan. Saya lebih tertarik pada SUM sendiri. views_calc dapat memberikan wawasan, tetapi saya ingin menggunakan nilai dalam Bidang yang Dihitung ... yang bisa saya lakukan dengan views_get_view_result (atau serupa). Namun, mendapatkan Tampilan untuk menghasilkan permintaan itu di tempat pertama adalah triknya. Sepertinya cara meretas mungkin yang terbaik. Saya kira saya akan mulai dengan itu karena jika saya tidak melepaskannya, saya akan menjadi emas. Jika saya melakukannya, seseorang mudah-mudahan akan mengirimkan tambalan.
wizonesolutions