2014-05-08 3 views
3

Je cette ActiveRecord pour produire une requête,parenthèses CodeIgniter dans la requête Active Record

$this->purchase_requisition_model 
    ->where('deleted','1') 
    ->likes('to',$sapfvalue,'both') 
    ->likes('date',$sapfvalue,'both') 
    ->likes('request_by',$sapfvalue,'both') 
    ->likes('deliver_to',$sapfvalue,'both') 
    ->likes('name',$sapfvalue,'both') 
    ->likes('telephone',$sapfvalue,'both') 
    ->likes('designation',$sapfvalue,'both') 
    ->likes('budget_status',$sapfvalue,'both') 
    ->find_all(); 

ci-dessus ActiveRecord produira la requête suivante,

SELECT * FROM (`purchase_requisition`) 
WHERE `deleted` = '1' 
AND `to` LIKE '%fg%' 
OR `date` LIKE '%fg%' 
OR `request_by` LIKE '%fg%' 
OR `deliver_to` LIKE '%fg%' 
OR `name` LIKE '%fg%' 
OR `telephone` LIKE '%fg%' 
OR `designation` LIKE '%fg%' 
OR `budget_status` LIKE '%fg%' 

mais comment dois-je faire en utilisant ActiveRecord pour produire la requête ci-dessous?

SELECT * FROM (`purchase_requisition`) 
WHERE `deleted` = '1' 
AND ( `to` LIKE '%fg%' 
OR `date` LIKE '%fg%' 
OR `request_by` LIKE '%fg%' 
OR `deliver_to` LIKE '%fg%' 
OR `name` LIKE '%fg%' 
OR `telephone` LIKE '%fg%' 
OR `designation` LIKE '%fg%' 
OR `budget_status` LIKE '%fg%') 
+0

Selon [docs] (http://ellislab.com/codeigniter/user-guide/database/active_record.html) il n'y a pas de ** likes() ** fonction peut-être que vous utilisez des cms basés sur codeigniter Si oui, alors marquez-le correctement, vous n'utilisez pas directement l'enregistrement actif, aussi groupé où les clauses ne sont pas encore supportées par l'enregistrement actif, vous devez écrire une requête brute avec une échappée correcte des entrées –

Répondre

3

Comme @M Khalid Junaid a souligné, phonothèque actif Codeigniter ne prend pas en charge groupé où les clauses. Vous pouvez créer une solution de contournement à l'aide «où » tout en empêchant Codeigniter de s'échapper automatiquement la requête:

$escaped_sapfvalue = $this->db->escape($sapfvalue); 
$this->purchase_requisition_model 
->where('deleted','1') 
->where("(`to` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `date` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `request_by` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `deliver_to` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `name` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `telephone` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `designation` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->where("OR `budget_status` LIKE '%{$escaped_sapfvalue}%')", null, FALSE) 
->find_all(); 

Avis que la façon dont je me suis évadé manuellement la variable pour empêcher l'injection SQL. Notez également comment le premier et le dernier "LIKE" incluent respectivement les parenthèses d'ouverture et de fermeture.

Alors que cela fonctionne, il a beaucoup de code répété. Looping par un tableau serait plus élégant:

$escaped_sapfvalue = $this->db->escape($sapfvalue); 
$or_like = ''; 

foreach($column_list as $column) { 
    // If it's not the first column, add 'OR' 
    if (strlen($or_like) > 0) { 
     $or_like .= ' OR '; 
    } 
    // Concatenate manually escaped columns and rows 
    $escaped_column = $this->db->escape($column); 
    $or_like .= "`{$escaped_column}` LIKE '%{$escaped_sapfvalue}%'"; 
} 

// Add grouping parenthesis 
$grouped_or_like = "({$or_like})"; 

// Build the query 
$this->purchase_requisition_model 
->where('deleted','1') 
->where($grouped_or_like, null, false) 
->find_all(); 

EDIT: Et alors que je ne l'ai pas testé, je l'ai juste pensé que cela devrait fonctionner aussi:

$escaped_sapfvalue = $this->db->escape($sapfvalue); 
$this->purchase_requisition_model 
->where('deleted','1') 
->where("(`to` LIKE '%{$escaped_sapfvalue}%'", null, FALSE) 
->or_like('date',$sapfvalue,'both') 
->or_like('request_by',$sapfvalue,'both') 
->or_like('deliver_to',$sapfvalue,'both') 
->or_like('name',$sapfvalue,'both') 
->or_like('telephone',$sapfvalue,'both') 
->or_like('designation',$sapfvalue,'both') 
->where("OR `budget_status` LIKE '%{$escaped_sapfvalue}%')", null, FALSE) 
->find_all(); 

Choisissez ce qui fonctionne le mieux pour toi.

+0

Merci pour cela je fais une boucle sur les termes de recherche contre tous Colonnes définies dans un tableau Vos exemples vont m'aider à construire une requête qui me permettra d'appliquer une condition where comme "active = true" tout en me permettant de faire une recherche par texte sur les colonnes du tableau. – Sam

Questions connexes