PHP Laravel извлекает данные из БД по месяцам и годам

Здравствуйте, у меня есть эта функция, которая суммирует Budget_cost и получает данные по месяцам.

public function marktingCost(){

$costs = \DB::table('campaigns')
    ->select('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_month'))
    ->addselect('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_year'))
    ->groupBy('campaign_leadsource_id')
    ->where('campaign_status_id',4) // campaign_status_id = 4 means campaign completed
    ->where(\DB::raw('MONTH(created_at)'), Carbon::today()->month)
    ->get(); return $costs}

то, что я пытаюсь достичь, это получить данные по месяцам как Budget_total_month и получить данные по годам как Budget_total_year но я не могу использовать условие внутри запроса, я хочу сделать что-то вроде этого

->select('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_month') ->where(\DB::raw('MONTH(created_at)'), Carbon::today()->month))
->addselect('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_year') ->where(\DB::raw('Year(created_at)'), Carbon::today()->year))

Но, конечно, это недействительно

то, что я хочу в качестве вывода, это то, что

[{"campaign_leadsource_id":1,"budget_total_month":11475,"budget_total_year":134761,"olxTotal":12,"budget_per_lead":11230},{"campaign_leadsource_id":2,"budget_total_month":4221,"budget_total_year":41215,"olxTotal":9,"budget_per_lead":4579}]

заранее спасибо

Я предполагаю, что первый месяц должен быть месяцем только одного года, а не одним и тем же месяцем каждого года? Какую версию Laravel вы используете?

Rwd 15.03.2019 08:33

whereYear('created_at', '=', $year) ->whereMonth('created_at', '=', $month)

Palak Jadav 15.03.2019 08:35

Здравствуйте, спасибо за ответ, я пробовал это так: `->select('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as Budget_total_' . $Month)->whereMonth('created_at', '=', $Month)) ->addselect('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as Budget_total_' . $Year)->whereYear('created_at', '=', $year))` но я получил "Вызов неопределенного метода Illuminate\Database\Query\Expression::whereMonth()"

mohamed adel 15.03.2019 08:59

я использую laravel 5.7 всего один месяц с этого года

mohamed adel 15.03.2019 09:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
563
2

Ответы 2

Я знаю, что вы используете классы/методы laravel как абстракцию для SQL. Но пробовали ли вы использовать PDO и фактические операторы SQL для извлечения данных?

я совершенно новый, как я могу этого добиться? Можете ли вы дать мне пример кода для начала?

mohamed adel 15.03.2019 10:10

Пример оператора выбора PDO можно увидеть внизу этого сайта w3schools.com/php/php_mysql_select.asp

Ray 15.03.2019 10:39

Пожалуйста, попробуйте этот код.

$costs = \DB::table('campaigns')
        ->select('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_month'))
        ->addselect('campaign_leadsource_id', \DB::raw('SUM(budget_cost) as budget_total_year'))

        ->where('campaign_status_id',4) // campaign_status_id = 4 means campaign completed
        ->where(\DB::raw('MONTH(created_at)'), Carbon::today()->month)
        ->groupBy(\DB::raw("MONTH(created_at)"))
        ->get();

Спасибо за ваш ответ, я попробовал, но получил эту ошибку SQLSTATE[42000]: Syntax error or access violation: 1055 'sedracrm.campaigns.campaign_leadsource_id' isn't in GROUP BY (SQL: select campaign_leadsource_id, SUM(budget_cost) as budget_total_month, campaign_leadsource_id, SUM(budget_cost) as budget_total_year from campaigns`, где campaign_status_id = 4 и MONTH(created_at) = 3 group by MONTH(created_at))`

mohamed adel 15.03.2019 10:47

Пожалуйста, сделайте это. В config\database.php --> массив "mysql" Установите 'strict' => false, чтобы отключить все. Или следуйте этому stackoverflow.com/questions/40917189/…

Mayank Dudakiya 15.03.2019 11:55

Он работает, но получает данные только по месяцам, а не по месяцам и годам.

mohamed adel 15.03.2019 12:24

замените это ->groupBy(\DB::raw("MONTH(created_at)"),\DB::raw("YEAR(creat‌​ed_at)")) Но вы должны проверить это, чтобы изменить код в хорошем состоянии stackoverflow.com/questions/40529355/…

Mayank Dudakiya 15.03.2019 12:31

это не сработало, но большое спасибо за ваши усилия <3

mohamed adel 15.03.2019 12:45

Это должно сработать, я уже делал это раньше с таким же подходом. Проверьте эту ссылку: stackoverflow.com/questions/40529355/…

Mayank Dudakiya 15.03.2019 12:47

Другие вопросы по теме