【发布时间】:2024-05-20 07:35:02
【问题描述】:
目标:使用实体 ->set() 和 ->save() 以编程方式将字符串字段的值从“1”更改为“01”
当尝试以编程方式(通过自定义模块的 cron 挂钩)更新节点上的字段时,“Text (plain)”字段的初始值为“1”。尝试以编程方式将字段更新为“01”(0 对业务目的很重要)时,将忽略更改。但是,如果我设置为几乎任何其他值,它确实有效。
// DOES NOT save update to field (Current value is "1")
$node = \Drupal\node\Entity\Node::load(1);
$node->set('field_code', '01'); // '01' is indeed a string
$node->save();
// DOES save update to field (Current value is "1")
$node = \Drupal\node\Entity\Node::load(1);
$node->set('field_code', '02');
$node->save();
如果我通过 UI 的节点编辑表单进行更改,更改将保存在相同的场景中。
有没有其他人遇到过这种情况?在 PHP 中保存为'01' == '1'; // true(作为字符串)之前,似乎必须进行一些验证,比较字符串。
【问题讨论】:
-
如果您将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式进行比较。这些规则也适用于 switch 语句。当比较是 === 或 !== 时不会发生类型转换,因为这涉及比较类型和值。 php.net/manual/en/language.operators.comparison.php
-
我会仔细检查该字段类型。如果它实际上是一个整数字段,那么您的洞察力很好,作为一种解决方法,您可以保存一个虚拟值,例如。 “666”,然后保存正确的值。我现在无法检查源代码,但如果您可以毫不犹豫地打开一个关于 PHP 类型在实体保存操作期间处理字符串比较(相等与相同)的 drupal 问题。
标签: php drupal drupal-8 drupal-nodes drupal-entities