Как получить данные нескольких таблиц с несколькими критериями в Laravel Eloquent? - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу получить данные из 4 разных таблиц, используя laravel eloquent с несколькими критериями.

Обзор моей таблицы;

Таблица 1

  • ID
  • имя

Таблица 2

  • ID
  • имя
  • год
  • table1_id

Таблица 3

  • ID
  • имя
  • описание
  • table2_id

Таблица 4

  • ID
  • имя
  • квартал
  • table3_id

ниже их отношения


Таблица 1

hasMany -> table 2

таблица 2

 belongsTo ->table1
 HasMany->table2

Таблица 3

 belongsTo ->table2
 HasMany->table3

Таблица 4

belongsTo ->table3

Я бы хотел получить данные по ресурсам с двумя параметрами и я попробовал это

   $Report = Table1::whereHas('tabke1', function($query){
        $query->where('year', 'like','%'.$year.'%');
      })
      ->with('table2')->whereHas('table3', function($query){
        $query->where('quarter', 'like', '%'.$quarters.'%');
      })
      ->get();

но я получаю синтаксическую ошибку.

Как я могу получить данные из нескольких таблиц с несколькими фильтрами? я попробовал этот запрос к таблице, чтобы понять больше, что я ожидаю

SELECT `table1`.*, `table2`.*, `table3`.*, `table4`.*
FROM `table1`, `table2`, `table3`, `table4`
WHERE ((`table2`.* year = 2019) AND (`table4`.* quarter = 1))

1 Ответ

1 голос
/ 24 апреля 2019

Я считаю, что есть два запроса для достижения результатов.

Первый запрос выглядит примерно так:

Table1::whereHas('table2', function ($query) {
    $query->where('year', 2019);
})
->whereHas('table2.table3.table4', function ($query) {
    $query->where('quarter', 1);
})
->get();

Второй запрос выглядит примерно так:

Table1::select('table1.*')
->join('table2', 'table1.id', '=', 'table2.table1_id')
->join('table3', 'table2.id', '=', 'table3.table2_id')
->join('table4', 'table3.id', '=', 'table4.table3_id')
->where('table2.year', 2019)
->where('table4.quarter', 1)
->distinct()
->get();

Что касается производительности, я предпочитаю второй запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...