Запрос к БД Laravel с фильтрацией из другой таблицы

На данный момент в одном из моих контроллеров у меня есть следующий запрос:

$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.

Мог попробовать join()

apokryfos 14.06.2018 15:58

Обратите внимание, что здесь мы предпочитаем технический стиль письма. Мы мягко не приветствуем приветствия, надеемся, что вы можете помочь, спасибо, заранее спасибо, благодарственные письма, приветы, добрые пожелания, подписи, пожалуйста, не могли бы вы помочь, болтливый материал и сокращенный txtspk, мольбу, как долго вы был застрял, советы по голосованию, мета-комментарии и т. д. Просто объясните свою проблему и покажите, что вы пробовали, чего вы ожидали и что на самом деле произошло.

halfer 15.06.2018 12:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
2
1 357
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас есть два варианта;

  1. Если вы используете построитель запросов, то есть DB :: query (), вам необходимо присоединиться к соответствующим таблицам и таким образом применить предложение where.

Конструктор запросов

    $equipment = DB::table('equipment_attachments')
            ->join('equipment', 'equipment.id', '=', 'equipment_attachments.equipment_id')
            ->where('type', 3)
            ->select('equipment_attachments.*')
            ->get();
  1. Если вы используете красноречивый ORM, вы можете использовать оператор whereHas (), но сначала вам нужно определить отношения в модели.

Красноречивые отношения

    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();

Другие вопросы по теме