By daffie on
Change record status:
Draft (View all draft change records)
Project:
Introduced in branch:
10.3.x
Introduced in version:
10.3.0
Issue links:
Description:
Creating a join with a condition can now also be a Condition object. A new method has been added to the condition object to compare two fields with each other. That method is called Drupal\Core\Database\Condition::compare().
A number of examples for how to replace the use of string conditions in joins with conditions of the type Drupal\Core\Database\Condition:
// Before
$query = \Drupal::database()->select('node', 'n');
$query->join('inner', 'comment', 'c', '[n].[nid] = [c].[nid]');
// After
$query = \Drupal::database()->select('node', 'n');
$condition = \Drupal::database()->condition('AND')->compare('n.nid', 'c.nid');
$query->join('left', 'comment', 'c', $condition);
// Before
$query = \Drupal::database()->select('node', 'n');
$query->innerJoin('comment', 'c', '[n].[nid] = [c].[nid]');
// After
$connection = \Drupal::database();
$query = $connection->select('node', 'n');
$query->innerJoin('comment', 'c', $connection->condition('AND')->compare('n.nid', 'c.nid'));
// Before
$query = \Drupal::database()->select('node', 'n');
$query->leftJoin('comment', 'c', '[n].[nid] = [c].[nid]');
// After
$connection = \Drupal::database();
$query = $connection->select('node', 'n');
$query->leftJoin('comment', 'c', $connection->condition('AND')->compare('n.nid', 'c.nid'));
// Before
$query = \Drupal::database()->select('base_table', 'b');
$query->innerJoin('data_table', 'd', '[d].[entity_id] = [b].[entity_id] AND [d].[entity_type] = [b].[entity_type] AND [d].[field_name] = [b].[field_name]');
// After
$connection = \Drupal::database();
$query = $connection->select('base_table', 'b');
$condition = \Drupal::database()
->condition('AND')
->compare('d.entity_id', 'b.entity_id')
->compare('d.entity_type', 'b.entity_type')
->compare('d.field_name', 'b.field_name');
$query->innerJoin(, 'data_table', 'd', $condition);
// Before
$query = \Drupal::database()->select('menu_link', 'ml');
$query->leftJoin('string_table', 'st', 'CAST([ml].[mlid] AS CHAR(255)) = [st].[objectid]');
// After
$connection = \Drupal::database();
$query = $connection->select('menu_link', 'ml');
$query->leftJoin('string_table', 'st', $connection->condition('AND')->where('CAST([ml].[mlid] AS CHAR(255)) = [st].[objectid]'));
// Before
$vid = 124;
$query = \Drupal::database()->select('term_node', 'tn');
$query->innerJoin('term_data', 'td', '[td].[tid] = [tn].[tid] AND [td].[vid] = :vid', [':vid' => $vid]);
// After
$connection = \Drupal::database();
$query = $connection->select('term_node', 'tn');
$query->innerJoin('term_data', 'td', $connection->condition('AND')->compare('td.tid', 'tn.tid')->condition('td.vid', $vid));
Impacts:
Module developers