web-dev-qa-db-ja.com

クエリを使用してコンテンツタイプのフィールド値を更新する

私は問題があります、皆さんが私を助けることができますように:)

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

5
Rijalul fikri

代わりにフィールド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

6
arpitr

私は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テーブルの両方を更新する必要があります。ノードの保存中に新しいリビジョンを作成した場合、どのように更新されるかわかりません。

0
AgA