Skip to content

Instantly share code, notes, and snippets.

@wiratama
Last active August 8, 2019 10:03
Show Gist options
  • Save wiratama/4cb7c68e057065e33ff2f558fac0509f to your computer and use it in GitHub Desktop.
Save wiratama/4cb7c68e057065e33ff2f558fac0509f to your computer and use it in GitHub Desktop.
avoid n+1 query on drupal custom module
public function yourMethodName()
{
$user_claims = $grouped_claims = [];
$claims = \Drupal::database()->select('crm_claim', 'cc')
->fields('cc')
->condition('user_id', $this->field_sso_id)
->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit($this->limit_content)
->execute()->fetchAll();
// eager load to avoid n+1 query
if($claims) {
foreach($claims as $claim) {
$user_claims[] = $claim->claim_id;
$grouped_claims[$claim->claim_id] = (array)$claim;
$grouped_claims[$claim->claim_id]['order'] = [];
$grouped_claims[$claim->claim_id]['shipping'] = [];
}
$orders = \Drupal::database()->select('crm_claim_order', 'cc')
->fields('cc')
->condition('claim_id', $user_claims, 'IN')
->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit($this->limit_content)
->execute()->fetchAll();
if($orders) {
$order_product = $products = [];
foreach($orders as $order) {
$product_type[$order->product_type][] = $order->product_id;
}
if(array_key_exists(1, $product_type)) {
$products = \Drupal::database()->select('crm_promotion', 'cp')
->fields('cp')
->condition('promotion_id', $product_type[1], 'IN')
->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit($this->limit_content)
->execute()->fetchAssoc();
}
foreach($orders as $order) {
$order->product = $products;
$grouped_claims[$order->claim_id]['order'][] = (array)$order;
}
}
$shippings = \Drupal::database()->select('crm_claim_shipping', 'cc')
->fields('cc')
->condition('claim_id', $user_claims, 'IN')
->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit($this->limit_content)
->execute()->fetchAll();
if($shippings) {
foreach($shippings as $shipping) {
$grouped_claims[$shipping->claim_id]['shipping'][] = (array)$shipping;
}
}
}
echo "<pre>";
print_r($grouped_claims);
echo "</pre>";
die();
return array(
'#theme' => 'block_claim_history',
'#grouped_claims' => $grouped_claims,
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment