2016-03-04 2 views
0

У меня есть 2 модели: MandrillEmail (электронный журнал) и клиенты. Я хочу, чтобы найти список клиентов, которые либо:CakePHP ИЛИ Вопрос о состоянии

  • НЕ был отправлен конкретным письмо,
  • или был отправлен конкретной электронной почта (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' 
); 

Однако, я точно не знаю, как изменить запрос, чтобы проверить также 2-ое заявление выше. Вот где я нахожусь:

// 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 дней, поэтому ИЛИ проверки заявление следует проверить только последняя запись.

+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 дней