Как использовать ИЛИ Условие в функции Paginate в Cakephp? - PullRequest
1 голос
/ 09 февраля 2010

Я столкнулся с проблемой при получении значений с помощью функции paginate в cakephp. В поле «to» сообщения у меня есть CSV поля userid. Для поиска сообщений для одного пользователя. Я использую код ниже ...

$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').","
    )
)));

Но запрос формируется таким образом, который не тот, который я хочу .. Я хочу два условия с условием ИЛИ.

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

Ответы [ 3 ]

4 голосов
/ 09 февраля 2010

Проблема в том, что ваш массив условий сталкивается с ограничением PHP: массив не может иметь два ключа с одинаковым именем.

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

Вы дважды используете ключ «Message.to LIKE», поэтому используется только последний.

Обходной путь выглядит так:

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

О, и вы должны серьезно подумать о а) нормализации базы данных и б) читабельности кода.

0 голосов
/ 17 мая 2011

Просто превратить условие в массив

$this->set('message', $this->paginate('Message', array(
        "Message.to LIKE" => array("".$this->Session->read('Auth.User.id').",",",".$this->Session->read('Auth.User.id').",")
)));
0 голосов
/ 11 февраля 2010

Я думаю, что часть проблемы может заключаться в том, что он использует LIKE только с синтаксисом буквального точного соответствия.

Если какое-либо из следующих предположений неверно, игнорируйте это.

Но похоже, что вы ищете user@domain.tld в строке to и должны приложить условие 'или', чтобы соответствовать случаю, когда получатель указан как один адрес электронной почты в строке электронной почты, разделенной запятой адреса ...

Я не думаю, что Cake автоматически добавляет символ '%' к запросам LIKE, так что, возможно, вы можете попробовать добавить его в запрос. Это должно привести к совпадению обоих случаев с одним условием в вызове find.

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