Красноречивый запрос, чтобы получить все сообщения, которые имеют более 0 просмотров, но не исключают сообщения, созданные_ за последние 24 часа? - PullRequest
2 голосов
/ 28 января 2020

У меня есть посты с полем views.

Я хочу запросить все посты и упорядочить их по created_at, однако я хочу исключить посты старше 24 часов с 0 views.

Если я это сделаю:

$posts = Post::where('views', '>', 0)->orderBy('created_at', 'desc')->get();

Я исключаю посты за последние 24 часа, у которых нет просмотров, как обновить вышеупомянутый запрос, так где предложение 'views' относится только к сообщениям старше 24 часов?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете передать функцию, где метод, как этот

Post::where(function($q) {
   $q->where('views', '>', 0)
    ->orWhere('created_at', '>=', Carbon::now()->subDay());
 })
    ->orderBy('created_at', 'desc')
    ->get();
2 голосов
/ 28 января 2020

Используйте вызов orWhere (), чтобы выполнить условие или в новом предложении where.

Post::where('views', '>', 0)
    ->orWhere('created_at', '>=', Carbon::now()->subDay())
    ->orderBy('created_at', 'desc')
    ->get();

Если у вас есть несколько условий where, может быть предпочтительнее, если вы находитесь внутри, где следует избегать приоритет условий для предоставления вам неисправных логов c.

Представьте себе, что добавление дополнительных логов c возможно только для данной команды.

Post::where('team_id', 1)
    ->where('views', '>', 0)
    ->orWhere('created_at', '>=', Carbon::now()->subDay())

Это выберет заданная команда с просмотром более 0 или чем-то созданным за последние 24 часа. Но часто вы хотите team_id в обоих условиях. Для этого его нужно заключить в другое условие where.

Post::where(function ($query) {
    $query->where('views', '>', 0)
    $query->orWhere('created_at', '>=', Carbon::now()->subDay())
});

Что обернет вас SQL условиями в круглые скобки, что намного надежнее и менее подвержено ошибкам.

where (views >= 0 or created_at >= '2020-01-28 00:00:00')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...