2016-03-04 39 views
0

我有2个模型:MandrillEmail(电子邮件日志)和客户端。我想找到的客户名单,要么:CakePHP OR条件问题

  • 尚未发送特定电子邮件
  • 或已被送到特定的电子邮件(email_content_id 5 =),但最后一个被送到更大的超过180天前。

最终,我想设置它以安排每隔180天发送一次电子邮件。我可以轻松完成第一项任务(检查是否未收到电子邮件)。代码如下(这个伟大的工程):

$options['joins'][] = 
    array('table' => 'mandrill_emails', 
    'alias' => 'MandrillEmail', 
    'type' => 'LEFT', 
    'conditions' => array(
     'MandrillEmail.client_id = Client.id', 
     "MandrillEmail.email_content_id = 5" 
    ) 
); 

$options['conditions'][] = array(
    'MandrillEmail.id is NULL' 
); 

不过,我不完全知道如何修改查询也检查上面的第二个声明。下面是我在哪里:

// check to see if the email HAS NOT been sent, or if it has, that it has been greater than 180 days 
$options['conditions'][] = array(
    'OR' => array(
     'MandrillEmail.id is NULL', 
     array(
      "MandrillEmail.status" => 'SENT', 
      "MandrillEmail.created <" => $today_minus_180days 
     ) 
    ) 
); 

另一件事要记住,这个电子邮件应每180天进行传送,所以OR语句检查应该只检查最后一个条目。

+0

请问您第一个实际工作送?做一个左连接(貌似从客户模型?)应该返回所有的客户端,不管他们与MandrillEmail的关联或缺乏。 – Dave

+0

什么版本的Cake,以及您第二次尝试生成什么查询?你能否包括整个事情,以便我们可以看到的不仅仅是条件?至少你在哪个模型上运行这个..等等。 – Dave

回答

0
$options['joins'][] = array(
     'table' => 'mandrill_emails', 
     'alias' => 'MandrillEmail', 
     'type' => 'LEFT', 
     'conditions' => array(
      'MandrillEmail.client_id = Client.id', 
      'MandrillEmail.email_content_id' => 5, 
      'MandrillEmail.status' => 'SENT', 
      'MandrillEmail.created <' => $today_minus_180days 
     ) 
    ); 

    $this->Client->virtualFields['have_that_email'] = 'COUNT(MandrillEmail.id)'; 

如果have_that_email大于0,电子邮件是从最近180天的