如何按当月显示数据,如果数据不存在则显示无数据信息

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()函数。为什么 NOTwhereMonth()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;
        }
    };

感谢所有试图帮助我的人!欣赏了!