如何按当月显示数据,如果数据不存在则显示无数据信息
How to display data by current month and display no data message if data not exists
我想按当月显示数据,如果当月没有数据则显示 'no data to display' 消息。我设法按日期显示所有数据,但这次我只希望它按当月显示数据。哦,我正在使用 Laravel & ChartJS。
控制器上的数据查询如下:
$achieveDaily = DailyProduction::orderBy('tgl', 'asc')->get();
这是显示数据的 foreach 函数:
foreach($achieveDaily as $ad){
$labels1[] = Carbon::parse($ad->tgl)->format('j');
$plan1[] = $ad->plan;
$actual1[] = $ad->actual;
};
这里是 chartjs 脚本:
<script>
var labelsL1 = JSON.parse('{!! json_encode($labels1) !!}');
var plan = JSON.parse('{!! json_encode($plan1) !!}');
var actual = JSON.parse('{!! json_encode($actual1) !!}');
const data = {
labels: labelsL1,
datasets: [{
label: 'Plan',
data: plan,
backgroundColor: 'rgba(0, 0, 255, 0.8)',
datalabels:{
color: '#000000',
anchor: 'end',
align: 'top'
},
},
{
label: 'Actual',
data: actual,
backgroundColor: 'rgba(0, 255, 0, 1)',
datalabels:{
color: '#000000',
anchor: 'end',
align: 'top'
},
}]
};
const config = {
type: 'bar',
data,
plugins: [ChartDataLabels],
options: {
scales: {
y: {
beginAtZero: true
}
}
}
}
const ctx = document.getElementById('dailyAchieveChart');
const dailyAchieve1 = new Chart(
ctx,
config
);
您可以在 laravel
中使用函数 whereMonth
DailyProduction::whereMonth('created_at', Carbon::now()->month)
->get();
所以如果你想按当月显示数据,可以使用whereDate()
函数。为什么 NOT 将 whereMonth()
和 whereYear()
结合在一起?
他们将 运行 单独查询以仅过滤特定月份和特定年份并将其合并。
所以 更好的查询 = 更好的性能。这是示例:
$dailyProduction = DailyProduction::whereDate('tgl', 'like', Carbon::now()->format('Y-m') . '%')->orderBy('tgl')->get();
$labels = [1, 2, ...]; // Basically anything to your graph labels, i assume you want to show daily
$plan = $actual = [];
foreach($dailyProduction as $daily) {
$plan[] = $daily->plan;
$actual[] = $daily->actual;
}
在您的图表中,如果没有数据,请将其留空。或者使用 blade @if @else
@if(empty($dailyProduction))
<p>No Data</p>
@else
// Your Graph
@endif
在你的<script>
。我假设你的其余 const data
是正确的
var labelsL1 = {!! json_encode($labels) !!};
var plan = {!! json_encode($plan) !!};
var actual = {!! json_encode($actual) !!};
我想我已经通过使用 if else 条件解决了这个问题,然后使用 isEmpty() 检查集合是否为空,如果不为空,则 运行 foreach。像这样:
if($achieveDaily->isEmpty()){
$labels1[] = [];
$plan1[] = [];
$actual1[] = [];
}else{
foreach($achieveDaily as $ad){
$labels1[] = Carbon::parse($ad->tgl)->format('j');
$plan1[] = $ad->plan;
$actual1[] = $ad->actual;
}
};
感谢所有试图帮助我的人!欣赏了!
我想按当月显示数据,如果当月没有数据则显示 'no data to display' 消息。我设法按日期显示所有数据,但这次我只希望它按当月显示数据。哦,我正在使用 Laravel & ChartJS。
控制器上的数据查询如下:
$achieveDaily = DailyProduction::orderBy('tgl', 'asc')->get();
这是显示数据的 foreach 函数:
foreach($achieveDaily as $ad){
$labels1[] = Carbon::parse($ad->tgl)->format('j');
$plan1[] = $ad->plan;
$actual1[] = $ad->actual;
};
这里是 chartjs 脚本:
<script>
var labelsL1 = JSON.parse('{!! json_encode($labels1) !!}');
var plan = JSON.parse('{!! json_encode($plan1) !!}');
var actual = JSON.parse('{!! json_encode($actual1) !!}');
const data = {
labels: labelsL1,
datasets: [{
label: 'Plan',
data: plan,
backgroundColor: 'rgba(0, 0, 255, 0.8)',
datalabels:{
color: '#000000',
anchor: 'end',
align: 'top'
},
},
{
label: 'Actual',
data: actual,
backgroundColor: 'rgba(0, 255, 0, 1)',
datalabels:{
color: '#000000',
anchor: 'end',
align: 'top'
},
}]
};
const config = {
type: 'bar',
data,
plugins: [ChartDataLabels],
options: {
scales: {
y: {
beginAtZero: true
}
}
}
}
const ctx = document.getElementById('dailyAchieveChart');
const dailyAchieve1 = new Chart(
ctx,
config
);
您可以在 laravel
中使用函数 whereMonthDailyProduction::whereMonth('created_at', Carbon::now()->month)
->get();
所以如果你想按当月显示数据,可以使用whereDate()
函数。为什么 NOT 将 whereMonth()
和 whereYear()
结合在一起?
他们将 运行 单独查询以仅过滤特定月份和特定年份并将其合并。
所以 更好的查询 = 更好的性能。这是示例:
$dailyProduction = DailyProduction::whereDate('tgl', 'like', Carbon::now()->format('Y-m') . '%')->orderBy('tgl')->get();
$labels = [1, 2, ...]; // Basically anything to your graph labels, i assume you want to show daily
$plan = $actual = [];
foreach($dailyProduction as $daily) {
$plan[] = $daily->plan;
$actual[] = $daily->actual;
}
在您的图表中,如果没有数据,请将其留空。或者使用 blade @if @else
@if(empty($dailyProduction))
<p>No Data</p>
@else
// Your Graph
@endif
在你的<script>
。我假设你的其余 const data
是正确的
var labelsL1 = {!! json_encode($labels) !!};
var plan = {!! json_encode($plan) !!};
var actual = {!! json_encode($actual) !!};
我想我已经通过使用 if else 条件解决了这个问题,然后使用 isEmpty() 检查集合是否为空,如果不为空,则 运行 foreach。像这样:
if($achieveDaily->isEmpty()){
$labels1[] = [];
$plan1[] = [];
$actual1[] = [];
}else{
foreach($achieveDaily as $ad){
$labels1[] = Carbon::parse($ad->tgl)->format('j');
$plan1[] = $ad->plan;
$actual1[] = $ad->actual;
}
};
感谢所有试图帮助我的人!欣赏了!