2016-01-20 10 views
5

Sto eseguendo una query in cui $sale_ids potrebbe potenzialmente contenere da 100 a migliaia di sale_ids. Sto cercando un modo per correggere l'errore regex senza modificare il core di CI 3.CI 3.0.4 grande where_in query cause Cause Messaggio: preg_match(): Compilazione non riuscita: l'espressione regolare è troppo grande a offset)

Questo non è accaduto nella versione 2 e NON è considerato un bug in CI 3 (ho sollevato il problema prima).

C'è un modo per farlo funzionare? Potrei cambiare la logica dell'applicazione, ma ciò richiederebbe giorni di lavoro.

Sto cercando un modo per estendere/eseguire l'override di una classe in modo che possa consentire il funzionamento di questa query Se non c'è un modo per eseguire questa operazione mediante l'override, dovrò hackerare il core (non so Come).

$this->db->select('sales_payments.*, sales.sale_time'); 
$this->db->from('sales_payments'); 
$this->db->join('sales', 'sales.sale_id=sales_payments.sale_id'); 
$this->db->where_in('sales_payments.sale_id', $sale_ids); 
$this->db->order_by('payment_date'); 

errore è:

Severity: Warning 

Message: preg_match(): Compilation failed: regular expression is too large at offset 53249 

Filename: database/DB_query_builder.php 

Line Number: 2354 

Backtrace: 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/Sale.php 
Line: 123 
Function: get 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/Sale.php 
Line: 48 
Function: _get_all_sale_payments 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/models/reports/Summary_payments.php 
Line: 60 
Function: get_payment_data 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/application/controllers/Reports.php 
Line: 1887 
Function: getData 

File: /Applications/MAMP/htdocs/phppos/PHP-Point-Of-Sale/index.php 
Line: 323 
Function: require_once 

risposta

11

Non c'era un buon modo per modificare il nucleo così mi si avvicinò con un piccolo cambiamento che ho fatto per il codice con grande where_in di. Avvia un gruppo e crea dove where_in's in blocchi più piccoli

$this->db->group_start(); 
$sale_ids_chunk = array_chunk($sale_ids,25); 
foreach($sale_ids_chunk as $sale_ids) 
{ 
    $this->db->or_where_in('sales_payments.sale_id', $sale_ids); 
} 
$this->db->group_end(); 
+0

Genius !! Proprio quello che stavo cercando! – rAjA

+0

Lei signore è molto geniale. Grazie! – Charas

+0

Grazie mille. Buon lavoro! – imilah

Problemi correlati