Drupal 8 如何编程创建带实体引用字段的节点 遇SQLSTATE[01000]报错
问题核心原因
你遇到的SQL报错和实体引用字段的写法无关,错误根源是created字段的赋值格式不符合Drupal规范:
- Drupal节点的
created字段存储的是Unix时间戳整数,而你传入的$job->publishedDate是ISO 8601格式的字符串(比如报错里的2021-08-17T12:32:12.397),数据库写入时格式不匹配触发了数据截断错误,报错里提到的taxonomy_index表写入只是节点保存流程的后续环节,本质是你传入的created值格式错误。
修复方案
- 先把传入的日期字符串转成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
相关产品推荐
相关产品推荐

