作者:亚艾元技术部
我们在Drupal8/9下面定制自己的实体时,可以方便对基字段(base field)设置索引,来增加查询时的效率。 设置索引的代码如下:
protected function getSharedTableFieldSchema(FieldStorageDefinitionInterface $storage_definition, $table_name, array $column_mapping) { $schema = parent::getSharedTableFieldSchema($storage_definition, $table_name, $column_mapping); $field_name = $storage_definition->getName(); $index_fields = ['uid', 'to', 'paper', 'gaohao', 'created']; if(in_array($field_name, $index_fields)){ $this->addSharedTableFieldIndex($storage_definition, $schema, TRUE); } return $schema; }
我们在'uid', 'to', 'paper', 'gaohao', 'created'几个base field上面设置了索引。
这个时候,我们给实体创建了表单,基于entity form。在添加实体的时候,如果有的字段没有设置值,我允许它们可以为空。但是在保存的时候,如果没有设置值,则会报错,无法保存。
我检查了一下,对于mysql的索引字段,需要为它设置一个值,最好这样。 我修改了保存实体的代码:
//设置默认值 if(empty($entity->uid->target_id)){ $entity->uid->target_id = \Drupal::currentUser()->id(); } if(empty($entity->to->target_id)){ $entity->to->target_id = 0; } if(empty($entity->paper->target_id)){ $entity->paper->target_id = 0; } //初始化为0字符串,这个字段加了索引。,不初始化的化,会报错, if(empty($entity->gaohao->value)){ $entity->gaohao->value = "0"; } if(empty($entity->created->value)){ $entity->created->value = time(); } $entity->changed->value = time(); $status = $entity->save();
给索引字段添加了默认值,这样就可以在没有填写的情况下添加信息了。