Я считаю, что вы ищете не-жадное регулярное выражение, например:
/<div class="the_class">(.*?)<\/div>/m
Обратите внимание на добавленный ?
. Теперь захватная группа будет захватывать как можно меньше (не жадные), а не как можно больше (жадные).
Я не думаю, что вам нужно created_at
в вашем SELECT
, чтобы получить желаемые результаты. Вы должны иметь возможность просто упростить запрос:
$concerns = DB::table('concerns')
->select(DB::raw('MONTHNAME(created_at) as month, count(*) as total'))
->whereBetween('created_at', [$start, $end])
->groupBy('month')
->orderBy('created_at', 'asc')
Обратите внимание, что предполагается, что между $start
и $end
не более 12 месяцев. В противном случае вам также необходимо сгруппировать по YEAR(created_at)
.
Если вы используете MySQL 8, или only_full_group_by
включен, вам нужно будет приложить больше усилий, чтобы получить действительный запрос, отвечающий требованиям для GROUP BY
. Это должно работать:
$concerns = DB::table('concerns')
->select(DB::raw('MONTHNAME(created_at) AS month, YEAR(created_at) AS year, count(*) as total'))
->whereBetween('created_at', [$start, $end])
->groupBy('year', 'month')
->orderBy('year', 'asc')
->orderByRaw("MONTH(STR_TO_DATE(CONCAT('1 ', month, ' ', year), '%e %M %y')) asc")
Я сделал демо этого запроса, работающего над dbfiddle