如何在Cakephp的Paginate函数中使用OR Condition?

时间:2010-02-09 06:48:19

标签: database cakephp join pagination

我在cakephp中使用paginate函数获取值时遇到问题。在消息的“到”字段中,我有userid的CSV字段。搜索单个用户的消息。我使用下面的代码......

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

但查询是以这种方式形成的,这不是我想要的..我想要两个OR条件的条件。

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 个答案:

答案 0 :(得分:4)

问题是你的条件数组在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') . ",")
)

哦,你应该认真思考a)数据库规范化和b)代码可读性。

答案 1 :(得分:0)

我认为问题的一部分可能是他只使用LIKE与文字完全匹配语法。

如果以下任何假设不正确,请忽略此..

但似乎您在to字符串中搜索user@domain.tld并且必须附加“或”条件以匹配收件人在逗号分隔的电子邮件字符串中列为单个电子邮件地址的情况地址...

我不认为cake会自动为LIKE查询添加'%'字符,因此您可以尝试将其添加到查询中。这应该使它在查找调用中与单个条件匹配。

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

答案 2 :(得分:0)

将条件设为数组

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