Nano Hash - криптовалюты, майнинг, программирование

Laravel и запросы с несколькими подсчетами с использованием Eloquent

Я пытаюсь оптимизировать свой код, в котором я генерирую статистику за последние семь дней.

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

пример:

// loop for number of days
for($i = 0; $i < $days; $i++){
    // some logic to set comparitive unix times
    $oldest = $newest - $dayDuration;

    // count number of objects between oldest time and newest time
    $counts[$i] = Object::where('objecttime','>',$oldest)
                          ->where('objecttime','<',$newest)->count();

    // more logic to set comparitive unix times
    $newest = $newest - $dayDuration;
}

Я знаю, что можно группировать запросы в sql, используя аналогичный синтаксис, как описано здесь; что я хотел бы знать, так это то, можно ли сделать то же самое, используя красноречивый / беглый в Laravel, или это возможно сделать только с помощью необработанных запросов?

РЕДАКТИРОВАТЬ: я не знаю, нужно ли мне уточнять, но это вопрос Laravel 3.

15.03.2013

Ответы:


1

Всякий раз, когда вы вызываете статический метод в своем классе модели, он возвращает запрос Fluent, например DB::table('yourmodeltable')->method. Если вы будете помнить об этом, вы скоро поймете, что с моделями Eloquent можно выполнить любой запрос.

Теперь для повышения производительности вы можете использовать SQL ДАТА(). Мой пример ниже не тестировался, поэтому не стесняйтесь исправлять его, пожалуйста.

// tomorrow -1 week returns tomorrow's 00:00:00 minus 7 days
// you may want to come up with your own date tho
$date = new DateTime('tomorrow -1 week');

// DATE(objecttime) turns it into a 'YYYY-MM-DD' string
// records are then grouped by that string
$days = Object::where('objecttime', '>', $date)
    ->group_by('date')
    ->order_by('date', 'DESC') // or ASC
    ->get(array(
        DB::raw('DATE(`objecttime`) AS `date`'),
        DB::raw('COUNT(*) as `count`')
    ));

foreach ($days as $day) {
    print($day->date . ' - '. $day->count);
}

Это должно напечатать что-то вроде:

2013-03-09 - 13
2013-03-10 - 30
2013-03-11 - 93
2013-03-12 - 69
2013-03-13 - 131
2013-03-14 - 185
2013-03-15 - 69

Изменить:

Предложенный выше подход возвращает экземпляры Eloquent Model, что может показаться странным, особенно если вы var_dump($days). Вы также можете использовать метод Fluent list() для достижения того же результата.

$date = new DateTime('tomorrow -1 week');

// lists() does not accept raw queries,
// so you have to specify the SELECT clause
$days = Object::select(array(
        DB::raw('DATE(`objecttime`) as `date`'),
        DB::raw('COUNT(*) as `count`')
    ))
    ->where('created_at', '>', $date)
    ->group_by('date')
    ->order_by('date', 'DESC') // or ASC
    ->lists('count', 'date');

// Notice lists returns an associative array with its second and
// optional param as the key, and the first param as the value
foreach ($days as $date => $count) {
    print($date . ' - ' . $count);
}
15.03.2013
  • спасибо за ответ, позвольте мне дать ответ и отчитаться. 15.03.2013
  • Я обновил ответ запросом, который я наконец использовал. Еще раз спасибо Винисиус. 22.03.2013
  • group_by() и order_by() у меня не работали. Мне пришлось использовать groupBy() и orderBy(). 03.10.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..