2017-06-08 1 views
1

Je souhaite effectuer une recherche par numéro de téléphone dans plusieurs champs db dans au moins 2 modules. J'ai une solution, mais il n'y a pas d'optimisation et très lent.Recherche complexe de modules croisés dans SugarCRM (SuiteCRM)

Ma solution:

custom/modules/Comptes/métadonnées/searchdefs.php

'phone' => array (
    'name' => 'phone', 
    'label' => 'LBL_ANY_PHONE', 
    'type' => 'name', 
    'default' => true, 
    'width' => '10%', 
), 

custom/modules/Comptes/métadonnées/SearchFields.php

'phone' => array(
    'query_type' => 'default', 
    'operator' => 'subquery', 
    'subquery' => array(
    'SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
    WHERE returnNumericOnly(phone_office_mask_c) LIKE', 

    'SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
    WHERE returnNumericOnly(phone_fax_mask_c) LIKE', 

    'SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
    WHERE returnNumericOnly(phone_alternate_mask_c) LIKE', 

    'SELECT acc.id FROM accounts acc 
     LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
     LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
     LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
    WHERE returnNumericOnly(cont_c.phone_mobile_mask_c) LIKE', 

    'SELECT acc.id FROM accounts acc 
     LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
     LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
     LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
    WHERE returnNumericOnly(cont_c.phone_work_mask_c) LIKE', 

    'SELECT acc.id FROM accounts acc 
     LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
     LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
     LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
    WHERE returnNumericOnly(cont_c.phone_fax_mask_c) LIKE', 

    'OR' => true 
), 
    'db_field' => array('id') 
), 

mais le résultat SQL quelque chose comme:

SELECT * 
FROM accounts 
LEFT JOIN accounts_cstm ON accounts.id = accounts_cstm.id_c 
LEFT JOIN ea1_lead_source jt0 ON accounts_cstm.ea1_lead_source_id_c = jt0.id AND jt0.deleted=0 
LEFT JOIN users jt1 ON accounts.created_by=jt1.id AND jt1.deleted=0 AND jt1.deleted=0 
LEFT JOIN ea1_region jt2 ON accounts_cstm.ea1_region_id_c = jt2.id AND jt2.deleted=0 
WHERE 
((

accounts.id IN (
    SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
     WHERE phone_office_mask_c LIKE '749577%') 

OR accounts.id IN (
    SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
     WHERE phone_fax_mask_c LIKE '749577%') 

OR accounts.id IN (
    SELECT id FROM accounts a LEFT JOIN accounts_cstm ac ON a.id = ac.id_c 
     WHERE phone_alternate_mask_c LIKE '749577%') 

OR accounts.id IN (
    SELECT acc.id FROM accounts acc LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
      LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
      LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
     WHERE returnNumericOnly(cont_c.phone_mobile_mask_c) LIKE '749577%') 

OR accounts.id IN (
    SELECT acc.id FROM accounts acc 
      LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
      LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
      LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
     WHERE returnNumericOnly(cont_c.phone_work_mask_c) LIKE '749577%') 

OR accounts.id IN (
    SELECT acc.id FROM accounts acc 
      LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
      LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
      LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
     WHERE returnNumericOnly(cont_c.phone_fax_mask_c) LIKE '749577%') 

)) 
AND accounts.deleted=0 
ORDER BY accounts.name ASC 

Je veux Résultat de la recherche SQL sans sous-requêtes, quelque chose comme:

SELECT * 
FROM accounts acc 
    LEFT JOIN accounts_cstm acc_c ON accounts.id = accounts_cstm.id_c 
    LEFT JOIN accounts_contacts ac_cont ON acc.id = ac_cont.account_id AND ac_cont.deleted = 0 
    LEFT JOIN contacts cont ON ac_cont.contact_id = cont.id AND cont.deleted = 0 
    LEFT JOIN contacts_cstm cont_c ON cont.id = cont_c.id_c 
    LEFT JOIN ... 
WHERE 
    acc_c.phone_office_mask_c LIKE '749577%' 
    AND acc_c.phone_fax_mask_c LIKE '749577%' 
    AND acc_c.phone_alternate_mask_c LIKE '749577%' 
    AND cont_c.phone_mobile_mask_c LIKE '749577%' 
    AND cont_c.phone_work_mask_c LIKE '749577%' 
    AND cont_c.phone_fax_mask_c LIKE '749577%' 
    AND …. 

peut-il être fait?

Répondre

0

Si vous utilisez l'opérateur de sous-requête, il fera une sous-requête.

Vous pouvez obtenir plus d'informations à partir du code source ici include/SearchForm/SearchForm2.php#L1164

Il y a toute recherche PHONE contacts par exemple, pourquoi ne pas l'utiliser comme base?