На данный момент в одном из моих контроллеров у меня есть следующий запрос:
$maintenances = DB::table("equipment_attachments")
->select(DB::raw('year(date) as year'), DB::raw("COUNT(*) as count"))
->where('attachmentCategory','Maintenance')
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
И это работает нормально, но я хотел бы еще больше отфильтровать это, и я считаю, что знаю, как это сделать с помощью моделей, но не совсем уверен в использовании функций БД.
Что я хотел бы сделать, так это использовать другую таблицу с именем equipment и использовать поле с именем type для фильтрации до тех, у которых тип только 3.
Итак, в основном я хотел бы отфильтровать то, что указано выше, но затем перейти к использованию поля в таблице equipment_attachments, где оборудование, указанное в поле equipment_attachments.unitID, равно equipment, где поле equipment.type равно 3.
Обратите внимание, что здесь мы предпочитаем технический стиль письма. Мы мягко не приветствуем приветствия, надеемся, что вы можете помочь, спасибо, заранее спасибо, благодарственные письма, приветы, добрые пожелания, подписи, пожалуйста, не могли бы вы помочь, болтливый материал и сокращенный txtspk, мольбу, как долго вы был застрял, советы по голосованию, мета-комментарии и т. д. Просто объясните свою проблему и покажите, что вы пробовали, чего вы ожидали и что на самом деле произошло.






У вас есть два варианта;
$equipment = DB::table('equipment_attachments')
->join('equipment', 'equipment.id', '=', 'equipment_attachments.equipment_id')
->where('type', 3)
->select('equipment_attachments.*')
->get();
EquipmentAttachment::whereHas('equipment', function($query) {
$query->where('type', 3);
})->all();
Лично я бы посмотрел на использование ORM, поскольку технически вам не нужно делать какой-либо необработанный SQL, что означает, что вы можете проще менять язык БД, если хотите. Я не уверен в вашем формате даты в БД, но если это метка времени, вы можете добиться того же в ORM с помощью;
EquipmentAttachment::where('date', (new DateTime())->format('Y')->all();
Наконец, если вы возьмете first (), get () или all (), вы можете поместить -> toSql (), и, например, оператор SQL может быть выведен эхом;
echo EquipmentAttachment::where('date', '2018-06-14')->toSql();
dd();
Надеюсь, это немного поможет.
Вы можете просто добавить join и использовать предложение where. ваш последний запрос будет выглядеть примерно так.
DB::table("equipment_attachments")
->join('equipments', 'equipments.id' , '=', 'equipment_attachments.unitID'
->select(DB::raw('year(date) as year'), DB::raw("COUNT(*) as count"))
->where('attachmentCategory','Maintenance')
->where('equipments.type', 3)
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
Также вы можете просто использовать selectRaw для выбора с помощью функций SQL.
DB::table("equipment_attachments")
->join('equipments', 'equipments.id' , '=', 'equipment_attachments.unitID'
->selectRaw("year(date) as year, COUNT(*) as count")
->where('attachmentCategory','Maintenance')
->where('equipments.type', 3)
->orderBy(DB::raw("year(date)"))
->groupBy(DB::raw("year(date)"))
->get();
Мог попробовать
join()