Получить топ-10 часто посещаемых столов, которым не более двух дней?

Это моя таблица mySql "listazelja": http://prntscr.com/duj2tf

я хочу получить то, что упомянуто в заголовке, с помощью этого кода в моем контроллере:

<?php

namespace App\Http\Controllers;

use App\ListaZelja;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class GlazbeniController extends Controller
{
    public function listazelja(){

        $sada = Carbon::now();

        $listaZelja = DB::table('listazelja')->orderBy('zapis_count','desc')->select(DB::raw('count(*) as zapis_count'),'zapis_id')
            ->groupBy('zapis_id')
            ->having($sada->diffInHours(Carbon::createFromFormat('Y-m-d H-m-s', 'created_at')) <= 48)
            ->take(10)->get();

        return view('pregledajlistuzelja',compact('listaZelja'));
    }
}

Это ошибка, которую я получаю:

InvalidArgumentException в строке 425 Carbon.php: не удалось найти год из четырех цифр. Отсутствуют данные

Я знаю, что проблема в этой строке кода: ->having($sada->diffInHours(Carbon::createFromFormat('Y-m-d H-m-s', 'created_at')) <= 48)

так что я должен сделать, чтобы заставить его работать.

P.S. created_at в mySql имеет тип: timestamp


person pobro123    schedule 12.01.2017    source источник
comment
Я думаю, что 'created_at' просто передается как строка, так как вы вызываете ее внутри $sada. PS. Вот почему я ненавижу фреймворки.   -  person fie    schedule 12.01.2017
comment
Попробуйте использовать функцию Mysql NOW() и INTERVAL или TiMEDIFF...   -  person ratmalwer    schedule 12.01.2017
comment
В Carbon::createFromFormat($format, $time, $tz); вторым аргументом должно быть $time, но вы передаете строку со значением created_at. Извлечено из Carbon документа Carbon::createFromFormat('Y-m-d H', '1975-05-21 22')->toDateTimeString(); // 1975-05-21 22:00:00   -  person Gayan    schedule 12.01.2017
comment
Ответ @EddyTheDove кажется нормальным   -  person Gayan    schedule 12.01.2017


Ответы (2)


Я думаю, что ваш запрос как:

$twoDaysOldDate = date("Y-m-d",strtotime('now -48 hours'));
$listaZelja = DB::table('listazelja')
           ->orderBy('zapis_count','desc')
           ->select(DB::raw('count(*) as zapis_count'),'zapis_id')
           ->groupBy('zapis_id')
           ->whereDate('created_at', '<=', $twoDaysOldDate)
           ->take(10)
           ->get();

Надеюсь, эта работа для вас!

person AddWeb Solution Pvt Ltd    schedule 12.01.2017

Попробуй это

$maxhours = Carbon::now()->subHours(48)->toDateTimeString();
$listaZelja = DB::table('listazelja')
            ->orderBy('zapis_count','desc')
            ->select(DB::raw('count(*) as zapis_count'),'zapis_id')
            ->groupBy('zapis_id')
            ->having('created_at' <= maxhours)
            ->take(10)->get();
person EddyTheDove    schedule 12.01.2017
comment
За исключением отсутствия $ в maxhours, что-то еще не работает. Но все равно спасибо. :) - person pobro123; 12.01.2017