2016-07-21 4 views
3

Ich versuche, das Jahr aus dem publication_date einer Tabelle in vielen Jahren zu entsprechen. Ich benutze Laravel (PHP).Wie Verwenden von REGEXP in MYSQL, um Datum IN Array zu entsprechen?

Ich habe so etwas wie geschrieben:

if($this->request->has('publication_years')){ 
    $years = implode('-[0-9]{2}-[0-9]{2}|', explode(',', $this->request->get('publication_years'))) . '-[0-9]{2}-[0-9]{2}'; 

    $model = $model->whereExists(function ($query) use ($years) 
    { 
     $query->select(DB::raw(1)) 
      ->from('patent') 
      ->whereRaw('patent.id = document.documentable_id') 
      ->whereRaw('document.documentable_type = "patent"') 
      ->whereRaw('(patent.publication_date REGEXP (' . $years . '))'); 
    }); 
} 

Die Jahre kommen wie ?publication_years=2015,2016. Ich explodiere sie benutzen das , Trennzeichen und implodiere sie dann, um das REGEXP Muster in einer Weise zu machen, die dem Datum entspricht. Die Müllhalde der Jahre danach ist wie 2015-[0-9]{2}-[0-9]{2}|2016-[0-9]{2}-[0-9]{2}.

Dies funktioniert bei http://regexr.com/, aber ich bekomme immer noch Fehler, so rate ich dort eine andere Syntax für MYSQL. Der Fehler, den ich sehe, ist:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[0-9]{2}-[0-9]{2}|2016-[0-9]{2}-[0-9]{2})))' at line 1 (SQL: select count(*) as aggregate from `document` where exists (select * from `folder` where `document`.`folder_id` = `folder`.`id` and (exists (select * from `user` inner join `accessible_by_user` on `user`.`id` = `accessible_by_user`.`user_id` where `accessible_by_user`.`accessible_id` = `folder`.`id` and `accessible_by_user`.`accessible_type` = folder and `user_id` = 1) or exists (select * from `role` inner join `accessible_by_role` on `role`.`id` = `accessible_by_role`.`role_id` where `accessible_by_role`.`accessible_id` = `folder`.`id` and `accessible_by_role`.`accessible_type` = folder and `role_id` in (1)))) and exists (select 1 from `patent` where patent.id = document.documentable_id and document.documentable_type = "patent" and (patent.publication_date REGEXP (2015-[0-9]{2}-[0-9]{2}|2016-[0-9]{2}-[0-9]{2})))) 

Was mache ich falsch? Wie kann ich das korrigieren?

+1

geben Sie die Regex in Anführungszeichen wie 'REGEXP '(2015- [0-9] {2} ..)' –

+0

REGEXP '^ (2016 | 2015)' – splash58

+0

Wow. Das war's. Ich fühle mich jetzt dumm. Wie auch immer, es hat funktioniert. Danke Jungs. Ich dachte, meine Regex wäre irgendwie falsch. – Rohan

Antwort

0

Hier ist ein Weg, um die regex prep für in MySQL:

$this_request_get_publication_years = "2015,2016,2017"; 
$years = '^(' . implode('|', explode(',',  
$this_request_get_publication_years)) . ')-[0-9]{2}-[0-9]{2}'; 
echo "(patent.publication_date REGEXP '" . $years . "')"; 
// => (patent.publication_date REGEXP '^(2015|2016|2017)-[0-9]{2}-[0-9]{2}') 

Die REGEXP '^(2015|2016|2017)-[0-9]{2}-[0-9]{2}' werden die Datensätze nur holen, die:

  • ^ - zu Beginn der Zeichenfolge haben. ..
  • (2015|2016|2017) - entweder der 3 Jahre (und mehr unterstützt werden, sicher)
  • -[0-9]{2} - eine hyp Henne gefolgt mit 2 Ziffern
  • -[0-9]{2} - ebd.

Die letzten zwei Untermuster können in (-[0-9]{2}){2} geschrumpft werden.

Verwandte Themen