作者:亚艾元技术部
我们在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();
给索引字段添加了默认值,这样就可以在没有填写的情况下添加信息了。

