Saya pikir ini adalah tugas yang mudah, namun sepertinya tidak ada metode Drupal untuk ini. Saya datang sejauh mengetahui saya harus menggunakan EntityFieldQuery
untuk ini - karena API mengatakan kondisi untuk user_load_multiple()
sudah usang.
Jadi saya mencoba ini:
$query = new EntityFieldQuery;
$query
->entityCondition('entity_type', 'user')
->propertyCondition('rid',array(1,2,3);
$result = $query->execute();
Namun saya mendapatkan ini:
PDOException: SQLSTATE [42S22]: Kolom tidak ditemukan: 1054 Kolom tidak dikenal 'users.rid' di 'di mana klausa': SELECT users.uid AS entity_id,: entity_type AS entity_type, NULL AS revision_id,: bundel AS bundel DARI {pengguna} pengguna WHERE (users.rid =: db_condition_placeholder_0); Array ([: db_condition_placeholder_0] => 3 [: entity_type] => pengguna [: bundle] => pengguna) di EntityFieldQuery-> execute ()
Jadi pikiran pertama saya adalah, bahwa saya harus bergabung dengan users_roles
-Tabel dan seterusnya, tetapi itu akan menyebabkan duplikat.
Adakah yang punya ide bagaimana melakukannya?
->propertyCondition('rid', array(1, 2, 3))
;Jawaban:
Sejujurnya, saya tidak tahu bagaimana mencapai ini. Contoh bagus tentang cara menggunakan EntityFieldQuery sulit ditemukan. Karena belum ada yang menjawab pertanyaan ini dan saya juga tertarik dengan solusi, saya akan mencoba membantu Anda. Dijelaskan di bawah ini adalah tebakan terbaik saya.
Satu hal yang perlu diingat: peran disimpan dalam tabel yang berbeda dari pengguna. Mereka ditambahkan menggunakan UserController :: attachLoad .
Tampaknya ada tiga kondisi berbeda yang bisa Anda gunakan dengan EntityFieldQuery:
Opsi paling logis (jika ada) adalah menggunakan propertiCondition, tetapi karena peran ditambahkan ke pengguna di UserController :: attachLoad Saya tidak berpikir EntityFieldQuery memiliki akses ke sana. Saya pikir EntityFieldQuery hanya menggunakan skema yang ditentukan dalam hook_schema ().
Ini membuat saya percaya bahwa apa yang Anda coba capai tidak mungkin. Solusinya adalah untuk mendapatkan semua cairan dengan permintaan normal:
Saya tidak memiliki akses ke Drupal sekarang, jadi kode di bawah ini mungkin tidak aktif. Saya yakin seseorang akan mengedit kesalahan.
Jika mungkin untuk mencapai apa yang Anda inginkan dengan EntityFieldQuery, saya akan tercerahkan.
sumber
$uids = $result->fetchColumn()
.Seharusnya melakukan trik
sumber
$query->leftJoin('users_roles', 'r', 'users.uid = r.uid');
bisa menyebabkan kolom 'uid' tidak dikenal. Dalam hal ini kita perlu menambahkan$query->propertyCondition('uid', 0, '!=')
, sehingga tabel pengguna akan berada dalam kueri.Sebenarnya ada cara untuk melakukan ini. Dalam intinya, EntityFieldQuery (EFQ) hanyalah kueri basis data yang dapat diubah dengan kueri alter kait.
Contoh sederhananya:
Namun ada beberapa peringatan kecil dengan ini yang akan memerlukan beberapa pengkodean lagi. Misalnya dalam menangani satu-satunya kondisi yang ada di EFQ menjadi fieldCondition, basis pengguna tidak akan ada, jadi ketika Anda menjemput pengguna berdasarkan peran dan satu kondisi lapangan, Anda juga harus memastikan bahwa tabel pengguna bergabung dan jika tidak, bergabung secara manual, yang merupakan sedikit proses yang membosankan.
Tetapi untuk kebutuhan Anda, ini akan membantu. Menyadari bahwa Anda dapat secara manual mengubah kueri EFQ membuka peluang besar dunia untuk membuat kueri yang sangat kuat sambil tetap menjaga antarmuka tetap bersih dan Drupal.
Beri tahu saya jika Anda memiliki pertanyaan atau masalah.
Sunting: Saya sebenarnya menemukan cara yang lebih banyak melakukan hal ini dan mengubah kode saya.
sumber
$query
? Dan saya mungkin juga menyarankanmymodule_get_users_by_rolename
untuk mengubah agar tidak mengembalikan hasil query itu sendiri, tetapi untuk dereference kuncinya'user'
.sumber
Anda masih dapat menggunakan EntityFieldQuery () setelah Anda mendapatkan id pengguna untuk peran Anda, jika Anda mau, misalnya karena Anda ingin pengguna fieldCondition () atau metode lain.
Menggunakan array $ uids dalam contoh di atas:
Akan lebih baik jika EntityFieldQuery memiliki metode bergabung.
sumber
sumber
$rolename
yang akan digunakan dalam panggilan keuser_role_load_by_name
dan cek untuk memastikanuser_role_load_by_name
tidak mengembalikan false.OK Ini sudah lama, tetapi Anda bisa melakukan sesuatu seperti ini:
sumber
Ini sedikit terlambat untuk permainan, tapi saya pikir itulah yang diminta OP. misal tidak ada sql, semua drupal. Semoga orang lain akan merasakan manfaatnya. Pencarian ini membawa saya ke sini dan inilah yang saya hasilkan.
sumber
Ini memang topik yang lebih tua dan saya menemukan banyak pendekatan yang bagus.
Saya akan meningkatkan sedikit pada solusi yang disediakan oleh @alf, karena saya pikir satu permintaan dengan bergabung adalah pendekatan terbaik. Namun saya juga suka fungsi saya memiliki parameter dan tidak bergantung pada konstanta. Jadi begini:
sumber
Anda dapat menemukan contoh penjelasan yang baik tentang cara menggunakan EntityFieldQuery di sini:
tetapi seperti yang dikatakan Berdir untuk saat ini "EFQ hanya mendukung properti dasar suatu entitas, yang merupakan bagian dari tabel entitas. Peran pengguna tidak terpapar dengan cara apa pun pada sistem entitas."
sumber
Saya tidak ragu ini bisa disederhanakan. Ini dapat dilakukan meskipun untuk drupal 8:
sumber