In Drupal 7, one was able to retrieve the physical names of the database tables using some code like the following, it was pretty simple:
$field_definitions = field_info_fields(); foreach ($field_definitions as $field => $definition) { $current_storage = $definition['storage']['details']['sql'][FIELD_LOAD_CURRENT]; $current_table = key($current_storage); $revision_storage = $definition['storage']['details']['sql'][FIELD_LOAD_REVISION]; $revision_table = key($revision_storage); }
In Drupal 8/9, the entity API changed for the better and now there are classes and services to pull this type of information. That’s all well and good, I understand most of the concepts around this, but I cannot for the life of me seem to extrapolate how to get this same data.
My goal is to loop over all my entity types that implement ContentEntityTypeInterface, get their fields and bundles, then build an array looking something like so, I have a very specialized Drush script I’m trying to port over from D7:
$example = [ 'node' => [ 'field_something' => [ 'current' => 'some_table_name' 'revision' => 'some_table_name' ] ], 'block' => [ 'field_something' => [ 'current' => 'some_table_name' 'revision' => 'some_table_name' ] ] ];
Taking into account if a field is actually revisionable in the first place, of course
On my own, I determined for the most part that table names end up being like like $entityType . '__' . $field['name'] and $entityType . '_revision__' . $field['name'] but hardcoding my script breaks down when unique ids are used. For example custom blocks have table names like block_content_r__7fe666c7a4. I need to be able to pull that data out of the "field storage definition" of sorts.