2016-06-27 2 views
0

Я хочу настроить запланированные электронные письма для рекомендуемых изменений масла. Для этого мне нужно выбрать из таблицы позиций, где последняя замена масла была более 3 месяцев назад. Мне нужно условие для игнорирования выбранных в настоящее время рядов клиентов, где замена масла была приобретена менее 3 месяцев назад. Как я могу добавить это условие?Laravel 4.2 - Выберите только строки, в которых количество строк на основе другого запроса 0

$search_term = 'oil change'; 
$date = new DateTime('-3 months'); 

$users = $this->prospectInstance->getDatabase()->table('LineItems') 
    ->join('WorkOrder', 'WorkOrder.id', '=', 'LineItems.order_id') 
    ->join('Customer', 'Customer.customer_id', '=', 'WorkOrder.customer_id') 
    ->where('LineItems.line_type', 'like', "%$search_term%") 
    ->where('WorkOrder.create_date', '<=', $date) 
    // this block produces errors 
    ->whereNotIn('Customer.customer_id', function($query) use ($search_term, $date) 
    { 
     return $query->where('LineItems.line_type', 'like', "%$search_term%") 
      ->join('WorkOrder', 'WorkOrder.id', '=', 'LineItems.order_id') 
      ->join('Customer', 'Customer.customer_id', '=', 'WorkOrder.customer_id') 
      ->where('WorkOrder.create_date', '>=', $date); 
    }) 
    ->orderBy('WorkOrder.create_date', 'DESC') 
    ->groupBy('Customer.customer_id'); 

Структура таблицы:

LineItems 
    order_id 
    line_type 

WorkOrder 
    id 
    customer_id 
    create_date 

Customer 
    customer_id 

Edit: я был в состоянии использовать советы ниже, чтобы использовать два отдельных запросов для достижения этой цели, но я хотел бы знать, если есть один запрос я могу создать для достижения того же результата:

$search_term = 'oil change'; 
$date = new DateTime('-3 months'); 

$base_query = $this->prospectInstance->getDatabase()->table('LineItems') 
    ->join('WorkOrder', 'WorkOrder.id', '=', 'LineItems.order_id') 
    ->join('Customer', 'Customer.customer_id', '=', 'WorkOrder.customer_id') 
    ->where('LineItems.line_type', 'like', "%$search_term%") 
    ->orderBy('WorkOrder.create_date', 'desc') 
    ->groupBy('Customer.customer_id'); 

$recent = clone $base_query; 
$users = clone $base_query; 

$recent->where('WorkOrder.create_date', '>', $date) 
    ->select('Customer.customer_id'); 
$users->where('WorkOrder.create_date', '<=', $date) 
    ->whereNotIn('Customer.customer_id', $recent->lists('customer_id')); 
+0

Вам нужно будет присоединиться к таблице и столбцу, где у вас есть записи о покупке нефти клиента в текущем запросе. – Olantobi

+0

Я думаю, вы могли бы просто сделать '-> whereNotIn ('Customer.customer_id', [array_of_custom_ids])' – Ohgodwhy

+0

SUNNYben прав, но для того, чтобы кто-либо мог ответить на это более подробно, вам нужно предоставить дополнительную информацию о вашей структуре таблицы и/или где информация о приобретенной дате. –

ответ

1

Я думаю, что это будет работать, но, очевидно, не тестируется:

$users = $this->prospectInstance->getDatabase()->table('Customer') 
    ->join('WorkOrder', 'WorkOrder.customer_id', '=', 'Customer.customer_id') 
    ->join('LineItems', 'LineItems.order_id', '=', 'WorkOrder.id') 
    ->where('LineItems.line_type', 'like', "%$search_term%") 
    ->whereNotIn('Customer.customer_id', function($query) use ($date, $search_term) 
    { 
     $query->select('Customer.customer_id') 
      ->from('Customer') 
      ->join('WorkOrder', 'Customer.customer_id', '=', 'WorkOrder.customer_id') 
      ->join('LineItems', 'WorkOrder.id', '=', 'LineItems.order_id') 
      ->where('WorkOrder.create_date', '>', $date) 
      ->where('LineItems.line_type', 'like', "%$search_term%"); 
    }) 
    ->orderBy('WorkOrder.create_date', 'desc') 
    ->groupBy('Customer.customer_id'); 
+0

Где в вашем запросе есть условие игнорировать клиентов, у которых есть заказы на работу с изменениями масла за последние три месяца? – Shane

+0

'-> где ('LineItems.line_type', 'like',"% $ search_term% ")' возвращает только записи, которые являются изменениями масла или пользователями, у которых нет рабочих операций ('-> orWhereNull ('WorkOrder.create_date') '). Он отфильтровывает любую из этих записей с датами раньше трех месяцев с '-> где ('WorkOrder.create_date', '<=', $ date)' –

+0

Я не думаю, что мы на одной странице. Поскольку я не хочу посылать по электронной почте клиентов, у которых были изменения масла за последние 90 дней, мне нужно условие, чтобы не выбирать этих пользователей. Запрос, который вы предоставили (и запрос, с которого я начал), просто не выбирает пользователей с недавними изменениями масла. Мне действительно нужно знать пользователей, у которых были последние изменения масла, поэтому я могу удалить их из окончательного результата, если они присутствуют. Итак, выберите пользователей, у которых была смена масла 90 дней назад, и у которых НЕ было замены масла 1-89 дней назад. – Shane

Смежные вопросы