Я хочу настроить запланированные электронные письма для рекомендуемых изменений масла. Для этого мне нужно выбрать из таблицы позиций, где последняя замена масла была более 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'));
Вам нужно будет присоединиться к таблице и столбцу, где у вас есть записи о покупке нефти клиента в текущем запросе. – Olantobi
Я думаю, вы могли бы просто сделать '-> whereNotIn ('Customer.customer_id', [array_of_custom_ids])' – Ohgodwhy
SUNNYben прав, но для того, чтобы кто-либо мог ответить на это более подробно, вам нужно предоставить дополнительную информацию о вашей структуре таблицы и/или где информация о приобретенной дате. –