You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Drupal 8 如何编程创建带实体引用字段的节点 遇SQLSTATE[01000]报错

问题核心原因

你遇到的SQL报错和实体引用字段的写法无关,错误根源是created字段的赋值格式不符合Drupal规范:

  • Drupal节点的created字段存储的是Unix时间戳整数,而你传入的$job->publishedDate是ISO 8601格式的字符串(比如报错里的2021-08-17T12:32:12.397),数据库写入时格式不匹配触发了数据截断错误,报错里提到的taxonomy_index表写入只是节点保存流程的后续环节,本质是你传入的created值格式错误。

修复方案

  1. 先把传入的日期字符串转成Unix时间戳再赋值给created字段,优化后的代码如下:
// 把ISO格式日期转成Unix时间戳
$publishedTimestamp = strtotime($job->publishedDate);

$newJob = Node::create([
    'type' => 'jobs',
    'title' => $job->label,
    'uid' => 219,
    'field_api_id' => $job->id,
    'created' => $publishedTimestamp, // 替换为转换后的时间戳
    'field_jobs_title_function' => [
      'value'   =>  $job->label
    ],
    'field_jobs_purpose' => [
      'value'   =>  !is_object($job->JobDataSet->JobData->role)            ? $job->JobDataSet->JobData->role            : '',
      'format'  => 'full_html_no_ckeditor'
    ],
    'field_jobs_how_to_apply' => [
      'value'   =>  !is_object($job->JobDataSet->JobData->requiredFiles)   ? $job->JobDataSet->JobData->requiredFiles   : '',
      'format'  => 'full_html_no_ckeditor'
    ],
    'field_link_cta' => [
      'uri'   =>  !is_object($job->JobDataSet->JobData->applyUrl)          ? $job->JobDataSet->JobData->applyUrl        : '',
      'title' =>  'Postuler maintenant !'
      ],
    // 实体引用字段可直接在创建时传入,无需额外二次保存
    'field_domain' => [
      'target_id' => $domain
    ]
  ]);

$newJob->setPublished(TRUE);
$newJob->save();

额外说明

你尝试的两种实体引用字段赋值写法本身都符合Drupal规范:

  • 在Node::create参数里直接传'field_domain' => ['target_id' => $domain]是推荐写法,一次保存即可完成所有字段写入,性能更好
  • 先保存节点再单独赋值$newJob->field_domain->target_id = $domain再二次保存的写法也可以正常运行,只是多了一次数据库写入操作

内容的提问来源于stack exchange,提问作者b.ferdinand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:54:03