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

时间:2014-04-25 16:53:24

标签: php html oop laravel eloquent

我有一个典型的模型关系。我的模型QRhasMany评分,模型RatingbelongsTo Qr

现在我想通过这样的Ratings循环输出属于单个qr模型的foreach

            <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);
}

这是我的两个模型

Rating.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');
    }
}

我实际上想要输出Qr-Code的ratings计数。我知道可以这样做:

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

但是我想在foreach循环

中以某种方式这样做
 {{ $Qr->rating->count() }}

如果这在某种程度上是可能的。

如果我只输出first()的{​​{1}},那么我得到关系      的var_dump($ qrs-&GT; ratings-&GT;指定者())

但我不知道如何获得计数与Qr循环相结合的评分数。任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

这里有些不对劲:

// 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-&gt; rating-&gt; count()这将是Collection方法。

答案 1 :(得分:1)

首先你使用了这个:

@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);
}

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

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