【问题标题】:Laravel - Undefined variable when no data exists when filtered in databaseLaravel - 在数据库中过滤时不存在数据时未定义的变量
【发布时间】:2017-12-25 05:18:29
【问题描述】:

我遇到了一个错误: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 的行。

“tle”表可能没有过滤后的 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

【问题讨论】:

    标签: php sql laravel laravel-5 foreach


    【解决方案1】:

    Laravel 包含一个选项:

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

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

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

    【讨论】:

    • 这里有什么问题:@foreach($orbitalelements as $orbitdata)!?如果未设置$orbitalelements,则,for 和foreach 将不起作用。
    • 这确实修复了没有数据的页面的未定义变量错误,但对于有数据的页面,它会显示两次(即 $orbitdata 中的任何内容重复)
    • 数据库中的每一行一次,对吗?这是一个 foreach 循环。
    • 是的。 $data 变量的情况完全相同。
    • 数组中的每个条目运行一次,如果数组为空,则运行底部。如果您看到不同的行为,请发布您的数据转储以及您所看到的内容
    【解决方案2】:
    @if(count($orbitalelements))
      @foreach($orbitalelements as $orbitdata)
      @endforeach
    @endif 
    

    应该可以工作,因为 count($orbitalelements) 计数为零,这是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-10
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多