Преобразование laravel необработанных SQL-запросов в коллекции

Я пытаюсь использовать пакет https://erik.cat/projects/Charts/docs/5 для отображения диаграмм в моем проекте laravel, но я заметил, что мне нужно использовать модели / коллекции для него (базы данных) для работы. Вот пример из документации

$chart = Charts::database(User::all(), 'bar', 'highcharts');

Теперь я не использую красноречивый ORM для своих запросов, вместо этого использую необработанные запросы. Я не знаю, как преобразовать этот конкретный запрос, чтобы он возвращал коллекцию вместо массива, который он возвращает в настоящий момент

$result = DB::select("SELECT DATE(a.created_at) as date, SUM(a.credit) as credit, SUM(a.debit)
        FROM telco_transactions AS a
        WHERE a.telco_id = '1' and DATE(a.created_at) BETWEEN DATE(NOW())-INTERVAL 7 DAY AND DATE(NOW())
        GROUP BY DATE(a.created_at)");

mysql,laravel-5,highcharts,

1

Ответов: 3


0

Вы можете использовать whereBetweenсделку с датами и DateTimeс тем, modifyчтобы получить первое свидание.

$now = date('Y-m-d H:i:s');
$before = new DateTime();
$before->modify('-7 days');
$result = TelcoTransaction::where('telco_id', 1)
                          ->whereBetween('created_at', [$before->format('Y-m-d H:i:s', $now])
                          ->groupBy('created_at')
                          ->get();      

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


0

Привет, вы можете сделать что-то вроде этого

$result->toArray();

0

Если вам действительно нужны модели, вы должны использовать hydrate()( https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_hydrate ). В приведенном примере код должен быть следующим:

$transactionsData = DB::select("SELECT DATE(a.created_at) as date, SUM(a.credit) as credit, SUM(a.debit)
    FROM telco_transactions AS a
    WHERE a.telco_id = '1' and DATE(a.created_at) BETWEEN DATE(NOW())-INTERVAL 7 DAY AND DATE(NOW())
    GROUP BY DATE(a.created_at)");

return Transactions::hydrate($transactionsData);

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

Если явно не нужна коллекция моделей, а просто набор результатов, используйте, collect()чтобы привести результат в коллекцию:

$transactionsData = DB::select("SELECT DATE(a.created_at) as date, SUM(a.credit) as credit, SUM(a.debit)
    FROM telco_transactions AS a
    WHERE a.telco_id = '1' and DATE(a.created_at) BETWEEN DATE(NOW())-INTERVAL 7 DAY AND DATE(NOW())
    GROUP BY DATE(a.created_at)");

return collect($transactionsData);
MySQL, Laravel-5, Highcharts,
Похожие вопросы