Before: getFields contained incomplete info about foreign keys, so trying to map the schema was unnecessarily difficult.
After: No need to use extra DAO methods like getReferenceColumns() to find out about FKs. All the info is returned by getFields.
public function fields() {
$fields = parent::fields();
+ $fields[] = [
+ 'name' => 'fk_column',
+ 'data_type' => 'String',
+ 'description' => 'Name of fk_entity column this field references.',
+ ];
$fields[] = [
'name' => 'dfk_entities',
'description' => 'List of possible entity types this field could be referencing.',
elseif (($data['html']['type'] ?? NULL) === 'EntityRef' && !empty($data['pseudoconstant']['table'])) {
$field->setFkEntity(CoreUtil::getApiNameFromTableName($data['pseudoconstant']['table']));
}
+ if (!empty($data['FKColumnName'])) {
+ $field->setFkColumn($data['FKColumnName']);
+ }
return $field;
}
*/
public $fkEntity;
+ /**
+ * @var string
+ */
+ public $fkColumn;
+
/**
* @var string
*/
*/
public function setFkEntity($fkEntity) {
$this->fkEntity = $fkEntity;
+ // If the field has a FK Entity, then FK Column also must be set.
+ if ($fkEntity) {
+ // Ensure a sensible default if not already set.
+ $this->fkColumn ??= 'id';
+ }
+ return $this;
+ }
+ /**
+ * @return string|null
+ */
+ public function getFkColumn(): ?string {
+ return $this->fkColumn;
+ }
+
+ /**
+ * @param string $fkColumn
+ * @return $this
+ */
+ public function setFkColumn($fkColumn) {
+ $this->fkColumn = $fkColumn;
return $this;
}
// fk_entity should be specific to specified entity_table, but dfk_entities should still contain all values
$this->assertEquals('Activity', $tagFields['entity_id']['fk_entity']);
$this->assertContains('Contact', $tagFields['entity_id']['dfk_entities']);
+ $this->assertEquals('id', $tagFields['entity_id']['fk_column']);
$tagFields = EntityTag::getFields(FALSE)
->addValue('entity_table:name', 'Contact')
$this->assertNull($spec['suffixes']);
$this->assertEquals('EntityRef', $spec['input_type']);
$this->assertEquals('Activity', $spec['fk_entity']);
+ $this->assertEquals('id', $spec['fk_column']);
$this->assertEquals($subject, $spec['input_attrs']['filter']['subject']);
// Check results
$activities = $this->saveTestRecords('Activity', [