2013-11-28 9 views
6

Ich habe folgende find Abfrage für meine CakePHP App:CakePHP finden query% mit wie%

$this->paginate = array(
'limit'=>5, 
'order'=>'Note.datetime DESC', 
'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'Note.title LIKE' => '%'. $q . '%', 
     'Note.content LIKE' => '%'. $q . '%' 
     ) 
    ) 
); 

, die einen Parameter $q zu tun, wie Abfrage sowohl Titel und Inhalt aufgerufen nimmt.

So zum Beispiel, wenn ich folgendes:

Title: Lorem ipsum Content: Lorem ipsum dolare

und die Suche nach 'lorem'

Es es in Ordnung finden würde. Aber wenn ich nach 'lorem dolare' suche, wird es es nicht finden.

Wie mache ich das?

Hinweis: Ich will keine Plugins verwenden usw.

EDIT: Wenn ich FULLTEXT- würde diese Arbeit?

$this->paginate = array(
'limit'=>5, 
'order'=>'Note.datetime DESC', 
'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'MATCH(Note.title) AGAINST('.$q.' IN BOOLEAN MODE)', 
     'MATCH(Note.content) AGAINST('.$q.' IN BOOLEAN MODE)' 
     ) 
    ) 
); 

EDIT 2:

Erhalten dieser Fehler die oben versuchen:

Error: 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 'dolor IN BOOLEAN MODE)) OR (MATCH(`Note`.`content`) AGAINST(lorem dolor IN BOOLE' at line 1 

SQL Query: SELECT `Note`.`id`, `Note`.`title`, `Note`.`excerpt`, `Note`.`content`, `Note`.`datetime`, `Note`.`user_id`, `Note`.`slug`, `Note`.`status`, `Note`.`topic_id`, `User`.`id`, `User`.`email`, `User`.`firstname`, `User`.`lastname`, `User`.`password`, `User`.`status`, `Topic`.`id`, `Topic`.`title`, `Topic`.`slug` FROM `db52704_driz2013`.`notes` AS `Note` LEFT JOIN `db52704_driz2013`.`users` AS `User` ON (`Note`.`user_id` = `User`.`id`) LEFT JOIN `db52704_driz2013`.`topics` AS `Topic` ON (`Note`.`topic_id` = `Topic`.`id`) WHERE `Note`.`status` = 1 AND ((MATCH(`Note`.`title`) AGAINST(lorem dolor IN BOOLEAN MODE)) OR (MATCH(`Note`.`content`) AGAINST(lorem dolor IN BOOLEAN MODE))) ORDER BY `Note`.`datetime` DESC LIMIT 5 
+0

Versuchen Sie, die erste '%' –

+0

@ Fred-II- Entfernen Immer noch nicht, es zu finden. – Cameron

+0

Ich dachte gerade darüber nach, was Wayne unter "FULLTEXT" -Suche gepostet hat. Werfen Sie einen Blick auf diese Fragen und Antworten zu SO http://stackoverflow.com/q/17294924/1415724 kann helfen. –

Antwort

6

Versuchen Sie, diese

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     "MATCH(Note.title) AGAINST('".$q."' IN BOOLEAN MODE)", 
     "MATCH(Note.content) AGAINST('".$q."' IN BOOLEAN MODE)" 
    ) 
) 

);

Mit anderen Worten, setzen Sie die Suchkriterien mit Zitaten

EDIT NDM Vorschlag macht Sinn

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
    'Note.status'=>1, 
    'OR' => array(
     'MATCH(Note.title) AGAINST(? IN BOOLEAN MODE)' => $q, 
     'MATCH(Note.content) AGAINST(? IN BOOLEAN MODE)' => $q 
    ) 
) 

);

+0

Boom :) Funktioniert perfekt. Danke – Cameron

+2

Es ist auch eine perfekte SQL-Injection-Schwachstelle! ;) Bitte verwenden Sie stattdessen die richtige [** Array Syntax **] (http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions): '" MATCH (Post.title) GEGEN (? IN BOOLEAN MODE) "=> $ q' @Cameron – ndm

+0

@ndm Kannst du GENAU, wie du denkst, dass die ganze Sache aussehen sollte, posten? Danke – Cameron

1

LIKE werden Sie hier nicht helfen. Ihr Titel ist Lorem ipsum und Ihr Inhalt ist Lorem ipsum dolare. Sie suchen nach lorem dolare, die nicht über den LIKE-Operator gefunden werden, da es keine Teilzeichenfolge innerhalb dieser Spalten ist. Sie müssen mit FULLTEXT arbeiten oder Sie müssen etwas wie Sphinx verwenden. Sehen Sie sich this answer here an, wenn Sie herausfinden möchten, welche Lösung Sie implementieren möchten.

+0

Was würden Sie dann vorschlagen? – Cameron

+0

@Cameron Meine Antwort aktualisiert. –

+0

Können Sie ein Beispiel teilen? Ich fand das: http://Stackoverflow.com/questions/10827444/cakephp-fulltext-search-mysql-with-rating irgendwelche gute für was ich will? – Cameron

4

Sie können auch versuchen, diese:

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
     'Note.status'=>1, 
     'OR' => array(
      'Note.title LIKE' => "%$q%", 
      'Note.content LIKE' => "%$q%" 
     ) 
    ) 
); 
0
Please Try this: 

$this->paginate = array(
    'limit'=>5, 
    'order'=>'Note.datetime DESC', 
    'conditions' => array(
     'Note.status'=>1, 
     'OR' => array(
      'Note.title LIKE' => "%".$q."%", 
      'Note.content LIKE' => "%".$q."%" 
     ) 
    ) 
);