私は問題があります、皆さんが私を助けることができますように:)
Bookというコンテンツタイプがあり、stockというフィールドがあります。 node_save()を使用する代わりに、手動クエリを使用して帳簿の値を更新します。このクエリがあります。MySQLクライアント(heidisql ex)から実行した場合、book stockの値はすでに変更されていますが、bookのノードを開いても何も起こりません。助けてください。
node_save()メソッド:
$node = node_load($id); // $id -> node id (nid)
$node->field_stock_value[$node->language][0]['value'] = "whatever";
node_save($node);
私のクエリ:
db_query("update field_data_field_stock b left join field_revision_field_stock rb on b.revision_id = rb.revision_id set b.field_stock_value = '{$stock}', rb.field_stock_value = '{$stock}' where b.entity_id = {$nid}");
Node_save()の代わりにqueryを使用したいのは、ノードを更新するためのバッチセットを実行したいからです。
よろしくお願いします、新年あけましておめでとうございます..:D
代わりにフィールドAPI field_attach_update() を使用しないのはなぜですか?node_save()プロセスを保存できます。
たとえばこれを取ります。
$node = new stdClass();
$node->id = $id_value; // node id
$node->type = $bundle_value; // aka content type
$node->field_fieldname[LANGUAGE_NONE][0]['value'] = 'some value';
field_attach_update('node', $node);
参照: http://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
私はmysqlクエリログをキャプチャしました(ここで言及されているように https://stackoverflow.com/questions/6479107/how-to-enable-mysql-query-log )ノード(タイプの求人)。 「指定」などのcckフィールドがテーブルでどのように更新されるかについて言及したい(ただし、新しいリビジョンは作成していない)。
-------------------------------------------
DELETE FROM field_data_field_designation
WHERE (entity_type = 'node') AND (entity_id = '599') AND (language IN ('und'))
-------------------------------------------
DELETE FROM field_revision_field_designation
WHERE (entity_type = 'node') AND (entity_id = '599') AND (revision_id = '636') AND (language IN ('und'))
-------------------------------------------
INSERT INTO field_data_field_designation (entity_type, entity_id, revision_id, bundle, delta, language, field_designation_tid) VALUES ('node', '599', '636', 'job_vacancy', '0', 'und', '4641'), ('node', '599', '636', 'job_vacancy', '1', 'und', '4642'), ('node', '599', '636', 'job_vacancy', '2', 'und', '4643'), ('node', '599', '636', 'job_vacancy', '3', 'und', '4644'), ('node', '599', '636', 'job_vacancy', '4', 'und', '4645'), ('node', '599', '636', 'job_vacancy', '5', 'und', '4646'), ('node', '599', '636', 'job_vacancy', '6', 'und', '4647'), ('node', '599', '636', 'job_vacancy', '7', 'und', '4648'), ('node', '599', '636', 'job_vacancy', '8', 'und', '4649'), ('node', '599', '636', 'job_vacancy', '9', 'und', '4650')
-------------------------------------------
INSERT INTO field_revision_field_designation (entity_type, entity_id, revision_id, bundle, delta, language, field_designation_tid) VALUES ('node', '599', '636', 'job_vacancy', '0', 'und', '4641'), ('node', '599', '636', 'job_vacancy', '1', 'und', '4642'), ('node', '599', '636', 'job_vacancy', '2', 'und', '4643'), ('node', '599', '636', 'job_vacancy', '3', 'und', '4644'), ('node', '599', '636', 'job_vacancy', '4', 'und', '4645'), ('node', '599', '636', 'job_vacancy', '5', 'und', '4646'), ('node', '599', '636', 'job_vacancy', '6', 'und', '4647'), ('node', '599', '636', 'job_vacancy', '7', 'und', '4648'), ('node', '599', '636', 'job_vacancy', '8', 'und', '4649'), ('node', '599', '636', 'job_vacancy', '9', 'und', '4650')
最新のリビジョンを削除し、同じリビジョンIDを持つ新しい値を挿入し直していることがわかります(ただし、ロジックについてはわかりません)。
そのため、特定のnidの特定の(最新の)リビジョンで同じ値を使用して、field_dataテーブルとfield_revisionテーブルの両方を更新する必要があります。ノードの保存中に新しいリビジョンを作成した場合、どのように更新されるかわかりません。