Laravel - 在数据库中过滤时没有数据时的未定义变量

时间:2017-07-19 18:59:20

标签: php sql laravel laravel-5 foreach

我正在努力解决我遇到的错误:Undefined variable: orbitdata。 我已经看了一些答案,我知道当数据库中没有与控制器中的过滤器匹配的数据时会发生这种情况。如果有数据则没有问题。

我使用的控制器是:

$satellite = DB::table('satellites')->where('norad_cat_id', $norad_cat_id)->get(); 
$data = DB::table('satellites')->where('norad_cat_id', $norad_cat_id)->get();
$orbitalelements = DB::table('tle')->where('norad_cat_id', $norad_cat_id)->get();
return view('pages/satellite', compact($data, 'data', $orbitalelements, 'orbitalelements'));

控制器背后的逻辑是通过norad_cat_id过滤数据库并返回具有相同norad_cat_id的行。

''' table可能没有过滤的norad_cat_id的任何数据,因此$ orbitalelements不返回任何数据。如果没有,我会收到此错误。

我的刀片文件包含$ orbitalelements变量的foreach语句:

@foreach($orbitalelements as $orbitdata)
@endforeach

我尝试添加一个isset语句(不起作用):

@if(isset($orbitalelements))
    @foreach($orbitalelements as $orbitdata)
    @endforeach
@endif 

如果没有数据库中的数据返回,我怎么做到这样我就不会得到未定义的变量错误?

编辑:这是我的完整刀片文件:

<div class="satellite-content">
    <div class="main-satellite-data">
        <ul>
        @foreach($data as $satellite)
            <span id="satellite-name">{{$satellite->satname}}</span>
            <li><span id="intldes">INTLDES: </span>{{$satellite->intldes}}</li>
            <li><span id="noradid">NORAD Cat ID: </span>{{$satellite->norad_cat_id}}</li>
            <li><span>Object Type: </span>{{$satellite->object_type}}</li>
            <li><span>Country: </span>{{$satellite->country}}</li>
            <li><span>Launch Date: </span>{{$satellite->launch}}</li>
            <li><span>Launch Site: </span>{{$satellite->site}}</li>
            <ul> 
                <li id="list-name"><span>ORBITAL ELEMENTS</span></li>
                <li><span id="inclination">Inclination: </span>{{$satellite->inclination}}</li>
                <li><span id="period">Period: </span>{{$satellite->period}}</li>
                <li><span id="apogee">Apogee: </span>{{$satellite->apogee}}</li>
                <li><span id="perigee">Perigee: </span>{{$satellite->perigee}}</li>
                <li><span id="decay">Decay: </span>{{$satellite->decay}}</li>
            @endforeach
            @forelse($orbitalelements as $orbitdata)
                <li><span id="epoch">Epoch: </span>{{$orbitdata->epoch}}</li>
                <li><span id="meanmotion">Mean Motion: </span>{{$orbitdata->mean_motion}}</li>
                <li><span id="eccentricity">Eccentricity: </span>{{$orbitdata->eccentricity}}</li>
                <li><span id="meananomaly">Mean Anomaly: </span>{{$orbitdata->mean_anomaly}}</li>
                <li><span id="bstar">Bstar: </span>{{$orbitdata->bstar}}</li>
            </ul>
            @empty
            <p>no data</p>
            @endforelse
        </ul>
        <div class="map-tle-padding">
            <div id="satellitemap"></div>
            <div class="tle-data">
                <ul>
                    <li id="list-name-tle"><span>TLE Data</span></li>
                    @forelse($orbitalelements as $orbitdata)
                    <li id="tle-data-main">{{$orbitdata->tle_line0}}</li>
                    <li id="tle-data-main">{{$orbitdata->tle_line1}}</li>
                    <li id="tle-data-main">{{$orbitdata->tle_line2}}</li>
                    @empty
                    <p>no data</p>
                    @endforelse
                </ul>
            </div>
        </div>
    </div>
</div>

结果: 没有数据:http://i.imgur.com/LNQCDLD.png

使用数据:http://i.imgur.com/27HD6qb.png

2 个答案:

答案 0 :(得分:2)

Laravel包含一个选项:

@forelse($orbitalelements as $orbitdata)
  ...
@empty
  ...No data...
@endforelse

此外,您使用compact错误。它应该只是:

return view('pages/satellite', compact('data', 'orbitalelements'));

答案 1 :(得分:0)

@if(count($orbitalelements))
  @foreach($orbitalelements as $orbitdata)
  @endforeach
@endif 

应该工作,因为count($orbitalelements)计数为零,这是假的。