我有一个自定义实体,其中有一个字段,定义如下。
$fields['file'] = BaseFieldDefinition::create('file')
->setDescription('Reference to the built-in core File entity type.')
->setLabel('File')
->setRequired(TRUE)
->setSetting('file_extensions', 'pdf rtf doc docx')
->setSetting('max_filesize', '20MB')
->setSetting('description_field', TRUE)
->setDisplayOptions('form', ['type' => 'file'])
->setDisplayOptions('view', ['type' => 'file']);从我自己的实体类型的实例中获取引用的File实体的字段是没有问题的。例如,这些行按预期工作。
$filename = $my_entity->file->entity->filename->value;
$username = $my_entity->file->entity->uid->entity->name->value;当我试图将引用的File实体的字段与TableSort一起使用时,代码抛出一个异常,我希望将其插入自定义实体类型的实体查询中。
$header['name'] = [
'data' => 'File Name',
'field' => 'file.entity.filename',
'specifier' => 'file.entity.filename',
];
$header['user'] = [
'data' => 'Uploaded By',
'field' => 'file.entity.uid.entity.name',
'specifier' => 'file.entity.uid.entity.name',
];
// …
$query->tableSort($header);未被发现的PHP异常Drupal\Core\Entity\Query\QueryException:“未找到”
对于$header数组的语法,我主要依赖于从带有EntityQuery的表获得的线索,其中Berdir建议我们查看UserListBuilder类的load()和buildHeader()方法。不幸的是,这个例子似乎使用的是直接存储在基表中的字段值,因此我回到了这样一个假设,即既然我们处于实体查询域,那么QueryInterface::condition()中描述的相同语法也会被期望。
我已经看过一些公开的问题,比如表排序忽略“字段”,始终将标题标题添加为订单查询参数。和桌面清理,但是我没有看到任何能说明这个问题的东西。
发布于 2022-04-30 21:03:12
在内核中有一个bug,目前的解决方法是:
'specifier' => 'file.target_id.entity.filename',原因是实体查询关系语法从连接支持开始,它先于核心中的实体引用支持,因此,虽然$entity->file->target_id->entity不受core支持,实体查询支持file.target_id.entity以指示它应该加入file字段指定的实体,实体id应该是target_id指定的。它有点笨重,但在当时,它是有效的。
它还应该能够计算出file.entity.filename,因为file字段的主属性名恰好是target_id,因此它可以将其扩展为file.target_id.entity.filename。但是,在Drupal\Core\Entity\Query\Sql\Tables非常复杂的情况下,类是非常复杂的,这个扩展对于共享表的情况有一个错误,这个错误将在https://www.drupal.org/project/drupal/issues/3278083中修复。
https://drupal.stackexchange.com/questions/310923
复制相似问题