У меня есть эта таблица, и я хочу разделить ее на несколько столбцов даты и СУММИТЬ оценку на эту дату, используя laravel Query Builder или Raw SQL, чтобы она стала такой:
все это до текущего месяца, так что январь до 31 и так далее






Вы не предоставляете ничего похожего на попытку запроса, как вы передаете дату (это диапазон, только месяц и т. д.) и желаемый вывод json.
трудно даже предположить, как вы собираетесь делать что-то специально, вы передаете значение столбца в качестве имени столбца в желаемом результате (что не имеет большого смысла с необработанным запросом sql, если только эти столбцы не динамичны).
но чтобы дать вам отправную точку, вы можете просто сгруппировать их по имени, затем по дате, а затем сделать еще одну группировку по дате в коллекции
э.и;
$result = DB::table('table_name')->select([
'name',
'date',
])
->selectRaw('sum(score) AS score')
->groupBy(['name', 'date'])->get();
return $result->groupBy('date');
тогда вы сможете получить результат в формате, как показано ниже;
{
"01-01-2023" : [
{
"name": "A",
"date": "01-01-2023",
"score": "300"
}
],
"02-01-2023" : [
{
"name": "A",
"date": "02-01-2023",
"score": "300"
}
{
"name": "B",
"date": "02-01-2023",
"score": "200"
}
],
"03-01-2023" : [
.
.
.
]
}
Для желаемого результата таблицы лучше изменить динамические строки вместо динамического столбца.
РЕДАКТИРОВАТЬ
В отношении ответа Карла вы можете просмотреть диапазон дат и ввести дополнительный оператор выбора.
э.и. даты текущего месяца
$dateRange = \Carbon\CarbonPeriod::create(now()->startOfMonth(), now()->endOfMonth() )->toArray();
$result = DB::table('table_name')->select(['name']);
foreach ($dateRange as $date) {
$dateFormat = $date->format('d-m-Y');
$day = $date->format('j');
$result->selectRaw("SUM(CASE WHEN Date = '$dateFormat' THEN Score ELSE 0 END) AS 'Day $day'");
}
return $result->groupBy('name')->get();
Каков наилучший способ добиться динамического столбца в laravel?
поскольку вы передаете диапазон дат, у вас есть строка для каждой даты, я не знаю, сколько значений имени может иметь каждая дата, но вы можете сделать имя в виде столбцов и дату в виде строки, потому что даты являются динамическими на основе вашего диапазона дат
есть несколько способов добиться этого, например, сопоставление коллекции или циклический просмотр каждого элемента и переформатирование всего результата, вам нужно ПЕРВЫЙ выяснить, как должен выглядеть ваш вывод JSON, который соответствует вашей желаемой таблице.
просто чтобы сохранить дату в группе по ->groupBy('дата');
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Спасибо за ответ, да, я использую диапазон дат, чтобы получить результат, я могу сделать его динамической строкой, но так сложно перенести эту строку в столбец.