Как передать значение в диаграммах consoletvs с помощью Laravel - PullRequest
0 голосов
/ 23 февраля 2019

Я хочу передать среднее время и электронную почту пользователя в consoletvs / charts. Я обращаюсь к SQL для этого

$currentTime = Carbon::today();

$time_difference = DB::select(DB::raw("SELECT `acu_name` ,AVG(TIMESTAMPDIFF(MINUTE, acu_at, acu_et)) as averageTime
FROM `active_user`
WHERE acu_at <= '$currentTime' GROUP BY `acu_name`"));

в этом результате SQL приходит, когда я получаю это через метод foreach, но еслипередать это через диаграммы, это показывает ошибку

 $chart = Charts::create('bar', 'highcharts')
            ->title('Total Clients Average Using Time')
            ->elementLabel("Total")
            ->labels($time_difference->acu_name)
            ->values($time_difference->averageTime)
            ->responsive(false);

Сообщение об ошибке:

enter image description here

Я не могу понять, что такоепроблемы, пожалуйста, помогите мне выяснить проблему, и я приложил структуру базы данных и пустые снимки экрана.Моя версия php 7.3.2 Laravel версия 5.5

enter image description here enter image description here

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Мне кажется действительно странным, что эта конкретная ошибка выбрасывается.Однако мы можем видеть в предоставленном вами коде следующее: $time_difference * * * * * * * * * * * * *

* * * * * * * * * * * * Illuminate\Database\Query\Builder Обычно это возвращает экземпляр * *1005*, который является объектом, если я не ошибаюсь.

Если вы посмотрите на исходный код , вы увидите, что эта функция возвращает $this, что является примером вышеупомянутого.

Что я могу сказать, чтоотсутствует выполнение запроса.Обычно за select() следует get() или first(), как показано в документации .

Еще одно действие, которое вы должны предпринять, это проверить что-либо, что было возвращено после того, каквыполнение вашего запроса.Ваш окончательный код с некоторыми изменениями может выглядеть так:

$time_difference = DB::table('active_user')
    ->select([
        'acu_name',
        DB::raw('AVG(TIMESTAMPDIFF(MINUTE, acu_at, acu_et)) as averageTime'),
    ])
    ->where('acu_at', '<=', $currentTime)
    ->groupBy('acu_name')
    ->first(); // Be aware this will only return the first row. Not sure if this is what you inted to do.


if (is_null($time_difference)) {
    // Do something when it has not been found.
}


 $chart = Charts::create('bar', 'highcharts')
    ->title('Total Clients Average Using Time')
    ->elementLabel("Total")
    ->labels($time_difference->acu_name)
    ->values($time_difference->averageTime)
    ->responsive(false);
0 голосов
/ 23 февраля 2019

Когда вы делаете DB::select(), это дает вам массив, имеющий объекты stdClass, представляющие найденные строки.Таким образом, даже если вы ожидаете, что одна результирующая строка выйдет из вашего DB::select() запроса, результат все равно будет внутри массива.

Так что, когда вы делаете следующее:

$currentTime = Carbon::today();

$time_difference = DB::select(DB::raw("SELECT `acu_name` ,AVG(TIMESTAMPDIFF(MINUTE, acu_at, acu_et)) as averageTime
FROM `active_user`
WHERE acu_at <= '$currentTime' GROUP BY `acu_name`"));

Этовозвращая массив и внутри которого есть совпадающие записи.

Вам нужно либо сделать foreach(), чтобы перебрать массив $time_difference, либо сделать $time_difference[0]-> acu_name

Кроме того, ваш DB::raw содержитпользовательская переменная, которая представляет опасность для SQL-инъекций.

Обновление:

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

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