【问题标题】:How to use OR Condition in Paginate function in Cakephp?如何在 Cakephp 的 Paginate 函数中使用 OR 条件?
【发布时间】:2011-01-14 16:46:42
【问题描述】:

我在 cakephp 中使用分页函数获取值时遇到问题。在消息的“收件人”字段中,我有用户 ID 的 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

【问题讨论】:

    标签: database cakephp join pagination


    【解决方案1】:

    只要把条件变成一个数组就行了

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 当然,我可能对 cake 添加的 '%' 分隔符有误。 Deceze 可能知道。
      【解决方案3】:

      问题是您的条件数组偶然发现了一个 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) 代码可读性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-03-29
        • 1970-01-01
        • 2011-12-30
        • 1970-01-01
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        相关资源
        最近更新 更多