2010-02-09 7 views
1

Je suis confronté à un problème lors de la récupération des valeurs en utilisant la fonction paginate dans cakephp. Dans le champ "à" du message, j'ai des champs CSV d'ID utilisateur. Pour rechercher des messages pour un seul utilisateur. J'utilise le code ci-dessous ...Comment utiliser la condition OU dans la fonction Pagination dans Cakephp?

$this->set('message', $this->paginate('Message', array(
    'or'=> array(
     "Message.to LIKE" => "".$this->Session->read('Auth.User.id').",", 
     "Message.to LIKE" => ",".$this->Session->read('Auth.User.id')."," 
    ) 
))); 

Mais la requête est formé de cette manière qui est pas ce que je veux .. Je veux deux conditions avec ou condition.

SELECT `Message`.`id`, `Message`.`timestamp`, `Message`.`to`, `Message`.`from`, 
     `Message`.`message`, `Message`.`subject`, `Message`.`urgent`, `Message`.`read`, 
     `Message`.`tag`, `Message`.`open`, `Message`.`reply_id`, `User`.`id`, 
     `User`.`fname`, `User`.`lname`, `User`.`user`, `User`.`password`, 
     `User`.`photo`, `User`.`created`, `User`.`access`, `User`.`login`, 
     `User`.`status`, `User`.`role` 
FROM `messages` AS `Message` 
LEFT JOIN `users` AS `User` ON (`Message`.`to` = `User`.`id`) 
WHERE `Message`.`to` LIKE ',1,' 
ORDER BY `Message`.`timestamp` desc 
LIMIT 5 

Répondre

4

Le problème est que vos conditions trébuche tableau à travers une limitation de PHP: un tableau ne peut pas avoir deux clés avec le même nom. Vous utilisez la clé "Message.to LIKE" deux fois, ainsi seul le dernier est utilisé. Vous utilisez la clé "Message.to LIKE" deux fois.

La solution ressemble à ceci:

'or'=> array(
    array("Message.to LIKE" => $this->Session->read('Auth.User.id') . ","), 
    array("Message.to LIKE" => "," . $this->Session->read('Auth.User.id') . ",") 
) 

Oh, et vous devriez réfléchir sérieusement à a) la normalisation de base de données et b) la lisibilité du code.

0

Je pense qu'une partie du problème pourrait être qu'il utilise LIKE avec seulement la syntaxe de correspondance exacte littérale.

Si l'une des hypothèses suivantes sont incorrectes IGNORE, alors ce ..

Mais il semble que vous recherchez [email protected] dans la chaîne à avoir et à fixer une condition « ou » pour correspondre à la Je ne pense pas que le gâteau ajoute le caractère '%' aux requêtes LIKE automagiquement la requête. Cela devrait faire correspondre les deux cas avec une seule condition dans l'appel find.

<?php 
    ... snip ... 
    'conditions' => array(
     "Message.to LIKE" => "%" . $this->Session->read('Auth.User.id') . "%" 
    ), 
    ... snip ... 
?> 
+0

bien sûr, je peux me tromper sur les délimiteurs de « % » ajoutés par gâteau. Deceze pourrait savoir avec certitude. –

0

Assurez la condition dans un tableau

$this->set('message', $this->paginate('Message', array(
     "Message.to LIKE" => array("".$this->Session->read('Auth.User.id').",",",".$this->Session->read('Auth.User.id').",") 
)));