0

我有两个模型,第一个:

class Tutorial extends Eloquent {

protected $table = 'tutorials'; 

public function rating()
{
    return $this->hasMany('Rating');
}   

}

和:

class Rating extends Eloquent {

protected $table = 'ratings';

public  $timestamps = false;

public function tutorial()
{
    return $this->belongsTo('Tutorial');
}   
}

现在在我的控制器中我有这个:

public function get_index() {

    $tutorials = tutorial::orderBy('created_at', 'desc')
        ->with('rating')
        ->paginate(25);

    return View::make('site/home/index')->with('tutorials', $tutorials);
}

那么我如何从我的视图中的一个教程中获得所有评级?!

编辑:

现在我有这个:

public function ratings()
{
    return $this->hasMany('Rating');
}   

public function getRating()
{
    // Grab the ratings from this tutorial
    $ratings = $this->ratings;
    $summedRatings = 0;

    // Loop through them all and add them together
    foreach($ratings as $rating)
    {
        console.log($rating->value);
        $summedRatings += $rating->value;
    }

    // Return the calculated average
    return $summedRatings / count($ratings);
}

public function get_index() {

    $tutorials = Tutorial::with('ratings')
        ->with('user')
        ->orderBy('created_at', 'desc')
        ->paginate(25);

    return View::make('site/home/index')->with('tutorials', $tutorials);
}

在我看来:

@foreach($tutorials as $tutorial)
<span>{{$tutorial->rating}}</span>

@endforeach

但是我所有的<span>都是空的!

更新:如果我这样做:

@foreach($tutorials as $tutorial)

            @foreach($tutorial->ratings as $rate)

            <span>{{$rate->value}}</span>

            @endforeach

一切都很好......那么有什么问题吗?

4

2 回答 2

2

根据您所在站点所在的平台,您应该始终使用正确的大小写。

$tutorials = tutorial::orderBy(...) // Wrong

$tutorials = Tutorial::orderBy(...) // Correct

要急切地加载评级,您应该始终在其他任何事情之前声明您的 'with' 方法。

$tutorials = Tutorial::with('rating')
                 ->orderBy('created_at', 'DESC')
                 ->paginate(25);

由于某种原因,这已被排除在 L4 文档之外。

在您看来,您现在可以使用此访问评级

foreach($tutorials as $tutorial)
{
    echo $tutorial->rating->{rating table column name};
}
于 2013-08-09T15:55:10.430 回答
0

首先,就命名约定而言,为了让事情更容易理解:rating()你的教程方法中的方法应该被调用ratings(),所以当你获取你的评分时,它看起来会更好($tutorial->ratings

重命名后,在您看来,在循环访问 $tutorials 数组时,您可以像这样访问每个人的评分:

foreach($tutorials as $tutorial)
{
    $ratings = $tutorial->ratings;
}

这将检索每个的评级对象。

您应该知道的是,如果您需要返回评级的计算,而不是 ORM 对象,您可以为模型创建属性

例如,如果每个评分是存储在amount列中的评分表中 1-5 的数字,您可以执行此操作以将每个评分的平均值设置为属性:

class Tutorial extends Eloquent {

protected $table = 'tutorials'; 

public function ratings()
{
    return $this->hasMany('Rating');
}  

public function getRating()
{
    // Grab the ratings from this tutorial
    $ratings = $this->ratings;
    $summedRatings = 0;

    // Loop through them all and add them together
    foreach($ratings as $rating)
    {
        $summedRatings += $rating->amount;
    }

    // Return the calculated average
    return $summedRatings / count($ratings);
}

}

然后在您的视图中,您可以回显该属性,就好像它是数据库的一部分一样

foreach($tutorials as $tutorial)
{
    echo $tutorial->rating;
}
于 2013-08-09T15:56:10.770 回答