Laravel对象关系在foreach循环中不起作用


Laravel Object Relation does not work in foreach loop

我有一个典型的模型关系。我有型号QR,它是hasMany Rating,还有型号Rating,它是belongsTo Qr

现在,我想通过foreach循环输出属于单个qr模型的Ratings,如下所示:

            <table>
                <tr>
                    <th>ID</th>
                    <th>UnitID</th>
                    <th># of Ratings</th>
                </tr>
                @foreach($qrs as $qr->ratings)
                <tr>
                    <td>{{$qr->id}}</td>
                    <td>{{$qr->unit_id}}</td>
                    <td>{{$qr->ratings->count()}}</td>
                </tr>
                @endforeach
            </table>

这是我的控制器:

public function index()
{
    //
    $unit = Unit::all()->first();
    $qrs = Qr::all()->first();
    return View::make('index')
        ->with('unit', $unit)
        ->with('qrs', $qrs);
}

这是我的两款

评级php:

    class Rating extends 'Eloquent {
    protected $guarded = [];
    public function qr(){
        return $this->belongsTo('Qr');
    }
}

Qr.php:

    class Qr extends 'Eloquent {
    protected $guarded = [];
    public function unit(){
        return $this->belongsTo('Unit');
    }
    public function ratings(){
        return $this->hasMany('Rating');
    }
}

我实际上想输出ratings的计数,一个Qr代码。我知道有可能这样做:

 {{Rating::where('qr_id', $qr->id)->count()}}

但我想在foreach循环中以某种方式这样做

 {{ $Qr->rating->count() }}

如果这是可能的话。

我得到了关系,如果我只输出Qrfirst(),然后var_dump($qrs->ratings->toArray())

但我不知道如何结合foreach循环来获得评分的计数。如有任何帮助,我们将不胜感激。

这里有几个错误:

// view:
@foreach($qrs as $qr->rating) 
// should be: 
@foreach($qrs as $qr)
// controller:
$unit = Unit::all()->first();
$qrs = Qr::all()->first();
// this way you get all Units then fetch first Unit from the collection,
// the same with Qrs, so change it to:
$unit = Unit::all(); // do you need it at all?
$qrs = Qr::with('ratings')->get();

这将解决问题,在foreach循环中,您将能够访问$qr->ratings->count(),这将是Collection方法。

一开始您使用的是:

@foreach($qrs as $qr->ratings)

你需要把它改成这个(正如已经在回答中所说的):

@foreach($qrs as $qr)

然后在index方法中,您使用了以下内容:

public function index()
{
    $unit = Unit::all()->first();
    $qrs = Qr::all()->first();
    return View::make('index')->with('unit', $unit)->with('qrs', $qrs);
}

在这种情况下,您需要获得QR模型的集合,由于UnitRatingQr相关,因此您可以使用withget()来获得QR模型的集合:

public function index()
{
    $qrs = Qr::with(array('unit', 'ratings'))->get();
    return View::make('index')->with('qrs', $qrs);
}

然后,您可以在view中循环Qr模型,如下所示:

@foreach($qrs as $qr)
    <tr>
        <td>{{ $qr->id }}</td>
        <td>{{ $qr->unit_id }}</td>
        <td>{{ $qr->ratings->count() }}</td>
    </tr>
@endforeach