Значение подзапроса Laravel От значения отношения hasmany - PullRequest
0 голосов
/ 07 января 2019

У меня есть модель

Logbook и модель LogbookEntries

Бортовой журнал hasMany Бортовой журнал Записи и Бортовой журнал Записи belongsto Бортовой журнал (выходит за рамки вопроса, хотя). В моем LogbookEntries у меня есть два поля (плюс другие): start date и end_date. Я хочу показать все Бортовые записи, для которых в качестве примера приведена следующая запись даты.

ЗАПИСЬ 1

start_date: 01 Mar 19
end_date: 05 Mar 19

ВХОД 2

start_date: 06 Mar 19
end_date: 12 Mar 19

ENTRY 3

start_date: 19 Jun 19
end_date: 22 Jun 19

Если я скажу показать все, у которых есть последующая дата, то будет отображаться только запись 3. Моя проблема:

Logbook::whereHas('LogbookEntries', function($q) {
    $q->where('start_date', <???.end_date + 1 day>)
})

1 Ответ

0 голосов
/ 09 января 2019

Это сработало для меня:

Если я правильно понимаю ваш вопрос, то я думаю, что самый простой способ добиться этого будет следующим:

Обратите внимание на использование whereraw вместо куда, чтобы мы могли использовать прямой mySql код

Logbook::whereHas('LogbookEntries', function($q) {
    $q->whereraw('date_format(date(end_date),"%Y-%m-%d") = date_format(date(start_date),"%Y-%m-%d") + interval 1 day')
})

Я проверил это на своей системе, и это сработало. Однако мои временные метки были в формате Y-m-d ЧЧ: мм: ii, поэтому мне понадобился формат date_ для их изменения. Вам может не понадобиться это. Поэтому вы можете попробовать следующее:

Logbook::whereHas('LogbookEntries', function($q) {
    $q->whereraw('date(end_date) = date(start_date) + interval 1 day')
})

Поскольку это было бы намного аккуратнее.


По сути, мы получаем записи, в которых end_date совпадает с start_date + 1 day. Вы были близки, но просто не совсем там.

Моя система, чтобы вы могли видеть, как она работает:

Без оператора whereraw:

>>> Task::Select('start_date','end_date')->get();
=> Illuminate\Database\Eloquent\Collection {#3325
     all: [
       App\Task {#3307
         start_date: "2018-12-20 08:00:00",
         end_date: null,
       },
       App\Task {#3291
         start_date: "2018-12-18 00:00:00",
         end_date: "2018-12-19 00:00:00",
       },
       App\Task {#3318
         start_date: "2018-12-19 00:00:00",
         end_date: "2019-01-03 00:00:00",
       },
       App\Task {#3319
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3310
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3317
         start_date: "2018-12-20 14:43:16",
         end_date: "2018-12-21 14:43:16",
       },
       App\Task {#3316
         start_date: "2018-12-20 14:45:27",
         end_date: "2018-12-27 14:45:27",
       },
       App\Task {#3315
         start_date: "2018-12-20 14:46:48",
         end_date: "2018-12-24 14:46:48",
       },
       App\Task {#3313
         start_date: "2018-12-21 09:25:24",
         end_date: "2018-12-24 09:25:24",
       },
       App\Task {#3298
         start_date: "2019-01-02 08:10:19",
         end_date: "2019-01-16 08:10:19",
       },
     ],
   }

С оператором whereraw:

>>> Task::Select('start_date','end_date')->whereraw('date_format(date(end_date),"%Y-%m-%d") = date_format(date(start_dat
e),"%Y-%m-%d") + interval 1 day')->get();
=> Illuminate\Database\Eloquent\Collection {#3314
     all: [
       App\Task {#3312
         start_date: "2018-12-18 00:00:00",
         end_date: "2018-12-19 00:00:00",
       },
       App\Task {#3309
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3320
         start_date: "2018-12-20 00:00:00",
         end_date: "2018-12-21 00:00:00",
       },
       App\Task {#3329
         start_date: "2018-12-20 14:43:16",
         end_date: "2018-12-21 14:43:16",
       },
     ],
   }
...