Использование условия whereRaw при загрузке Laravel с помощью построителя запросов - PullRequest
0 голосов
/ 26 июня 2018

Нам нужны те жалобы, у которых время жизни (create_at - now ()) больше, чем время жалобы (сумма времени жизни, хранящаяся в таблице complain_type) по красноречивым отношениям.

01.comЖурнальный столик:

+---+------------+-----------------+
|id | complain_preset_id  | created_at      |
+---+------------+-----------------+
| 1 | 48         | 3/16/2018 10:30 |
| 2 | 13         | 3/16/2018 10:43 |
| 3 | 12         | 3/16/2018 10:57 |
+---+------------+-----------------+

02. Пожаловаться на таблицу предустановок:

+---+------------+-----------------+
|id | type_id    | created_at      |
+---+------------+-----------------+
| 1 |  1         |  3/16/2018 6:29 |
| 2 |  2         |  3/16/2018 6:29 |
| 3 |  3         |  3/16/2018 6:29 |
+---+------------+-----------------+

03. Таблица типов жалоб

+---+------------+
|id | lifetime   |
+---+------------+
| 1 |  10        |
| 2 |  36        |
| 3 |  360       |
| 4 |  500       |
+---+------------+

Соотношение между жалобами и предустановками:

public function preset()
{
    return $this->belongsTo(ComplainPreset::class, 'complain_preset_id');
}

отношение между предустановкой-> жалобой:

public function complains()
{
    return $this->hasMany(Complain::class, 'complain_id');
}

И предустановка-> complain_type:

public function complainType()
{
    return $this->belongsTo(ComplainType::class, 'type_id');
}

complain_type-> предустановка:

public function presets()
{
    return $this->hasMany(ComplainPreset::class);
}

Нет прямой связи между жалобой и типом жалоб.

Вот наш красноречивый запрос. но этот запрос не работает.

Отношение жалуется-> предустановлено-> жалобно_тип

Complain::with(['preset' => function ($q) {
    $q->with(['complainType' => function($q2) {
        $q2->whereRaw('SUBTIME(NOW(), lifetime) > complains.created_at');
    }]);
}])->whereDate('created_at', '=' , Carbon::today());

В строке 3 этот запрос не получил complains.created_at, потому что эта строка ссылается на таблицу complain_type. В строке 3 нам нужно получить доступ к complains.created_at.

Есть какой-нибудь красноречивый способ?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете использовать whereHas():

Complain::whereHas('preset.complainType', function($query) {
    $query->whereRaw('SUBTIME(NOW(), lifetime) > complains.created_at');
})->whereDate('complains.created_at', '=', Carbon::today());
0 голосов
/ 26 июня 2018

Мы хотим, чтобы те жаловались

Вы можете использовать объединение, чтобы применить фильтр, используя столбец главной таблицы complains с вашей косвенно (через complain_preset) связанной таблицей complain_type

Complain::with('preset')
        ->join('complain_preset as cs','complains.complain_preset_id','=', 'cs.id')
        ->join('complain_type as ct','cs.type_id','=', 'ct.id')
        ->whereRaw('SUBTIME(NOW(), ct.lifetime) > complains.created_at')
        ->whereDate('complains.created_at', '=' , Carbon::today());
...