Laravel 4:在模板中排序对象


laravel 4: order object in template

我试图按created_at的降序对每个用户的测试进行排序。我在模板中尝试过,但没有成功。这些是我的表格:

 | users      |   | courses    |    | tests      |
 | ---------- |   |------------|    |------------|
 | id         |   | id         |    | id         |
 | name       |   | name       |    | name       |
 | created_at |   | created_at |    | created_at |
                  | user_id    |    | course_id  |

用户有很多课程,一个课程有很多测试。我想把所有的测试按created_at的降序排列。

我在我的模板中尝试过:

@foreach(User::find($user->id)->courses as $course)
        @foreach(Course::find($course->id)->tests as $test)
            <p>Name: {{$test->name}}</p>
            <p>Date: {{$test->created_at}}</p>
        @endforeach
@endforeach

编辑:这是我的模型

User.php

   public function courses()
   {
    return $this->hasMany('Course');
   }

Course.php

   public function user()
    {
    return $this->belongsTo('User');
    }
   public function test()
    {
    return $this->hasMany('Test');
    }

Test.php

   public function courses()
    {
    return $this->belongsTo('Course');
    }

你可以试试这个,在你的Controller:

$users = User::with(array('courses.tests' => function($query) {
    $query->orderBy('tests.created_at', 'desc');
}))->find($user->id);

然后加载视图并像这样传递$user对象:

return View::make('your_view_name')->withuser($user);

然后在你的view尝试这样做:

@foreach($user->courses->tests as $test)
        <p>Name: {{ $test->name }}</p>
        <p>Date: {{ $test->created_at }}</p>
@endforeach

您可以简单地将orderBy命令添加到查询中,如:

@foreach($user->courses as $course)
    @foreach($course->tests()->orderBy('created_at', DESC)->get() as $test)
        <p>Name: {{$test->name}}</p>
        <p>Date: {{$test->created_at}}</p>
    @endforeach
@endforeach

看,这不是一个很好的做法,使查询在视图中,所以我改变了你的查询在一些变量,你应该在你的控制器设置。还要将test()方法更改为tests(),因为它是一对多关系,使用复数作为方法名会更清楚。