How do you join a custom table to a node from a field with hook_views_data() I have a custom table that contains (for simplicity) two fields:


id
client_id


On my node content type, I have an integer type field called: field_dashboard_id.  All my nodes have the field_dashboard_id set to ids from the custom table.  I have a content view that I would like to also display the client id from the custom table. (FYI I am able to create a view if I use Dashboard Entries instead of Content but I want to use Content and join to Dashboard Entries)

I tried the following code but when I try to add a relationship, I am not seeing my custom table in Views.

/**
 * Implements hook_views_data().
 */
function mydashboard_views_data() {
  $data = [];

  $data['mydashboard_site']['table']['group'] = t('Dashboard');

  $data['mydashboard_site']['table']['base'] = [
    'field' =&gt; 'id',
    'title' =&gt; t('Dashboard entries'),
    'help' =&gt; t('Contains a list of dashboard entries.'),
  ];

  $data['mydashboard_site']['table']['join'] = array(
    'node' =&gt; array(
      'left_table' =&gt; 'node__field_dashboard_id',
      'left_field' =&gt; 'entity_id',
      'field' =&gt; 'id',
    ),
  );

  $data['mydashboard_site']['id'] = [
    'title' =&gt; t('ID'),
    'help' =&gt; t('Unique Site ID.'),
    'field' =&gt; [
      'id' =&gt; 'numeric',
    ],
    'filter' =&gt; [
      'id' =&gt; 'numeric',
    ],
    'argument' =&gt; [
      'id' =&gt; 'numeric',
    ],
    'sort' =&gt; [
      'id' =&gt; 'standard',
    ],
    'relationship' =&gt; [
      'base' =&gt; 'node', // The name of the table to join with.
      'base field' =&gt; 'field_dashboard_id', // The name of the field on the joined table.
      // 'field' =&gt; 'nid' -- see hook_views_data_alter(); not needed here.
      'handler' =&gt; 'views_handler_relationship',
      'label' =&gt; t('Default label for the relationship'),
      'title' =&gt; t('Title shown when adding the relationship'),
      'help' =&gt; t('More information on this relationship'),
      'extra' =&gt; [
        [
          'field'    =&gt; 'field_dashboard_id',
          'value'    =&gt; 'value',
          'operator' =&gt; '=',
          'numeric'  =&gt; true,
        ],
      ],
    ],
  ];

  $data['mydashboard_site']['client_id'] = [
    'title' =&gt; t('Client ID'),
    'help' =&gt; t('The client id'),
    'field' =&gt; [
      'id' =&gt; 'standard',
    ],
    'filter' =&gt; [
      'id' =&gt; 'string',
    ],
    'argument' =&gt; [
      'id' =&gt; 'string',
    ],
  ];

  return $data;
}


Update

Also tried the following:

$data['mydashboard_site']['table']['join'] = [
  'node__field_dashboard_id' =&gt; [
    'left_field' =&gt; 'field_dashboard_id_value',
    'field' =&gt; 'id',
  ],
];

'relationship' =&gt; [
  'base' =&gt; 'node__field_dashboard_id', // The name of the table to join with.
  'base field' =&gt; 'entity_id', // The name of the field on the joined table.
   // ID of relationship handler plugin to use.
  'id' =&gt; 'standard',
   // Default label for relationship in the UI.
  'label' =&gt; t('Example node'),
],
When you have a field you have a table for it with stored values, so you just add the fields table to your query 
Like 

/**
 * Implements hook_views_query_alter().
 */
function HOOK_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {  
   $query-&gt;addTable('my_fields_table');
   $query-&gt;addWhere(&lt;condition group id&gt;, '&lt;table_column&gt;', &lt;value&gt;, '&lt;operator&gt;');
   // These you can use to alter the behaviour for your condition group.
   //$query-&gt;setWhereGroup('OR/AND', &lt;condition group id&gt;);
   // This one is for the global group behavior.
   //$query-&gt;setGroupOperator('&lt;OR/AND&gt;');
  }
}