Saya pasti akan melakukannya field_attach_update
.
Idenya sederhana. Cukup muat simpul dan simpan menggunakan field_attach_update.
Ex:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Ini tidak akan mengubah stempel waktu atau kait apa pun yang biasanya dipanggil node_save. Memuat node juga akan meminta beberapa kait jadi mungkin itu tidak efisien.
Jika Anda memiliki nid dan jika struktur simpul mati sederhana, Anda dapat melakukannya seperti ini juga:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Bagaimanapun, jika Anda mencoba memperbarui apa pun selain bidang, ini tidak akan berfungsi (status komentar, status yang dipublikasikan, dll). Jika Anda menggunakan node_save, cache untuk node tertentu akan dihapus secara otomatis untuk metode yang berbeda, kami perlu menghapusnya dengan 'entitas_get_controller'.
Pembaruan:
Tampaknya Anda juga harus menelepon field_attach_presave()
untuk membiarkan modul lain memproses input bidang dengan benar. Modul file, misalnya, menggunakannya untuk mengatur status file ke permanen menggunakan kait ini. Saya telah memperbarui 2 contoh saya di atas.
field_attach_update
?node_save
kefield_attach_update
dan dariEntityFieldQuery
kedb_query_range
cukup menguntungkan. Dari pembaruan 3j hingga 40 menit.Jika Anda tidak ingin menyimpan data bidang tanpa menyebabkan peristiwa dan tindakan standar terjadi, Anda dapat menggunakan drupal_write_record .
Berikut ini adalah contoh untuk menyisipkan Hello World ke bidang tubuh untuk simpul artikel jenis dengan id 1.
Jika situs Anda multlingual, maka Anda ingin menggunakan 'en' atau bahasa konten Anda alih-alih 'und'.
Jika Anda melakukan revisi, Anda harus berhati-hati untuk memasukkan id revisi yang tepat, jika tidak, Anda dapat memasukkan nilai yang sama dengan entitas_id.
Perhatikan bagaimana data ini dimasukkan ke dalam dua tabel field_data_ * dan field_revision_ *. Anda harus memasukkan keduanya untuk memastikan situs berfungsi seperti yang diinginkan.
Setelah menjalankan ini, Anda perlu menghapus cache untuk menampilkan bidang-bidang tergantung pada bagaimana pengaturan cache Anda.
sumber
Untuk pembaruan sederhana seperti ini di mana banyak node perlu diperbarui, saya selalu menggunakan pernyataan pembaruan MySQL. Ya, caching perlu dipertimbangkan tetapi Anda bisa membersihkan cache setelah selesai dan semuanya baik-baik saja. Anda, tentu saja, harus terbiasa dengan struktur data tetapi relatif sederhana di Drupal 6. (walaupun menghebohkan di Drupal 7)
sumber
Saya sarankan
field_attach_update
juga, dan bukan query SQL langsung, karena sql tidak memperbarui objek cache node, dan di berikutnyanode_load
Anda tidak akan memuat nilai bidang yang diperbarui, Anda akan memuat nilai lamafield_attach_update
jauh lebih baik daripada query SQL langsung.sumber
stdClass
objek tanpa memuat. Apakah Anda tahu apa yang mungkin terjadi jika saya mencoba memperbarui simpul dengan cara ini tanpa mengatur semua bidang? Apakah itu akan ditimpa dengan nol atau default? Apakah itu akan diabaikan dengan memperbarui proses?Setelah mencoba semua pendekatan yang disebutkan dalam jawaban lain saya mendapat waktu pembaruan yang sangat lambat (sekitar 7 hari untuk 700.000 node dari jenis node dengan 20 bidang) sampai saya menemukan artikel ini: http://www.drupalonwindows.com/en/ blog / hanya-perbarui-berubah-bidang-atau-properti-entitas-drupal .
Setelah menerapkan sesuatu seperti kode di bawah ini di hook_update saya mengurangi waktu pembaruan menjadi 2 jam, yang saya pikir dapat dikelola.
sumber
Saya bahkan memiliki persyaratan yang sama untuk memperbarui bidang untuk semua node dari jenis konten tertentu. Saya menggunakan node_load_multiple dan field_attach_update .
Saya menjalankannya melalui drush dan itu cukup cepat.
sumber
Sudahkah Anda mempertimbangkan untuk melakukan pembaruan ini langsung ke dalam basis data menggunakan mySQL? Mungkin cara termudah & tercepat untuk mencapai apa yang Anda inginkan.
Ini adalah contoh sederhana. Anda dapat menjalankan perintah seperti itu dari tab 'SQL' di phpMyAdmin. Bayangkan Anda memiliki tipe konten yang disebut Profil Anggota. Di dalamnya Anda memiliki bidang bernama 'Jenis anggota' (misalnya perusahaan, individu, organisasi). Katakanlah Anda ingin memperbarui semua kejadian untuk 'PERUSAHAAN' menjadi 'perusahaan'. Perintah berikut akan melakukan hal itu.
UPDATE content_type_member_profile SET
field_type_of_member_value
= 'perusahaan' WHEREfield_type_of_member_value
= 'PERUSAHAAN';Juga, checkout Memulai dengan MySQL
sumber