1

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' => 'id',
    'title' => t('Dashboard entries'),
    'help' => t('Contains a list of dashboard entries.'),
  ];

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

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

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

  return $data;
}

Update

Also tried the following:

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

'relationship' => [
  'base' => 'node__field_dashboard_id', // The name of the table to join with.
  'base field' => 'entity_id', // The name of the field on the joined table.
   // ID of relationship handler plugin to use.
  'id' => 'standard',
   // Default label for relationship in the UI.
  'label' => t('Example node'),
],
  • just a suggestion you could use hook_views_query_alter() to add your table in a condition group. api.drupal.org/api/drupal/… – Insasse Aug 30 '17 at 6:01
  • In the past, I used query alter for altering the query but never to add fields. Do you know how I would be able to add a field? – albertski Aug 30 '17 at 21:20
  • posted an answer because this would be to long to comment. – Insasse Sep 1 '17 at 7:28
0

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->addTable('my_fields_table');
   $query->addWhere(<condition group id>, '<table_column>', <value>, '<operator>');
   // These you can use to alter the behaviour for your condition group.
   //$query->setWhereGroup('OR/AND', <condition group id>);
   // This one is for the global group behavior.
   //$query->setGroupOperator('<OR/AND>');
  }
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.