Laravel 4 - 使用雄辩选择列表中的未定义变量


Laravel 4 - Undefined variable in select list using Eloquent

我正在努力理解为什么我的选择列表返回错误。

我有一个嵌套的 foreach 循环,第二个循环应该按building_id显示记录。 然而,正是这个id,它返回了一个未定义的变量($building->id)

是查询的构造有问题吗?

<select>
     @foreach (Building::orderBy('title')->get() as $building)
          <optgroup label="{{ $building->title }}"></optgroup>
           @foreach (Floor::whereIn('id', function($query){
                 $query->select('floor_id')
                   ->from('rooms')
                   ->where('building_id', $building->id)->distinct();
                   })->get() as $floor)
            <option value="{{ $floor->id }}">{{ $floor->description }}</option>
           @endforeach    
     @endforeach
</select>

您正在使用已传递给Floor::whereIn的闭包函数因此,此闭包函数无法识别外部变量,例如您要在其中使用的变量/对象($building)。所以你必须告诉 PHP 在这个闭包/匿名函数中使用此$bulding变量:

<select>
     @foreach (Building::orderBy('title')->get() as $building)
          <optgroup label="{{ $building->title }}"></optgroup>
           @foreach (Floor::whereIn('id', function($query) use ($building){
                 $query->select('floor_id')
                   ->from('rooms')
                   ->where('building_id', $building->id)->distinct();
                   })->get() as $floor)
            <option value="{{ $floor->id }}">{{ $floor->description }}</option>
           @endforeach    
     @endforeach
</select>

所以现在函数可以识别这个变量:)阅读更多关于它的信息 : http://php.net/manual/en/functions.anonymous.php

像这样试试

  ....
  @foreach (Floor::whereIn('id', function($query) use ($building){
  ...