我有一个典型的模型关系。我有型号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() }}
如果这是可能的话。
我得到了关系,如果我只输出Qr
的first()
,然后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
模型的集合,由于Unit
和Rating
与Qr
相关,因此您可以使用with
和get()
来获得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