雄辩的sortBy()访问器未排序

时间:2019-03-19 13:32:03

标签: php mysql laravel eloquent laravel-blade

我需要能够通过通过访问器定义的属性来订购Collection。我正在为此苦苦挣扎,但我真的不明白为什么它无法正常工作。

以下是我的代码片段:

  

web.php

Route::get('/dashboard', 'HomeController@dashboard')->name('dashboard');
  

HomeController.php

public function dashboard()
{
    $drivers = User::whereHas('roles', function($q){
                $q->where('slug', 'driver');
            })->get();

    $sorteddrivers = $drivers->sortBy('last_free_time');

    $rides = Ride::all();
    return view('dashboard')->with('rides', $rides)->with('drivers', $sorteddrivers);
}
  

User.php

function getLastFreeTimeAttribute($driver_id)
{
    return UserController::lastFreeTime($driver_id);
}
  

UserController.php

public static function lastFreeTime($driver_id)
{
    // $result = Ride::with('driver')->orderBy('arrival','desc')->first();
    $result = DB::table('rides')
        ->join('users', 'users.id', '=', 'rides.user_id')
        ->select('rides.arrival')
        ->where('users.id','=',$driver_id)
        ->orderBy('rides.arrival', 'asc')
        ->first();

    if (is_null($result)) {
        return "";
    } else {
        return \Carbon\Carbon::parse($result->arrival)->format('H:i');
    }
}
  

dashboard.blade.php

<tbody>
    @foreach($drivers as $driver)
        <tr>
            <td>{{ $driver->name }}</td>
            <td>{{ App\Http\Controllers\UserController::lastFreeTime($driver->id) }}</td>
            <td>
                @if(  \App\Http\Controllers\UserController::isDriving($driver->id) )
                    <span class="bg-danger text-white p-1"><i class="fa fas fa-car fa-lg"></i> Busy</span>
                @else
                    <span class="bg-success text-white p-1"><i class="fa fas fa-car fa-lg"></i> Free</span>
                @endif
            </td>
        </tr>
    @endforeach
</tbody>

最后一条代码的第8行应该排序,但不是。有任何想法吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

不支持将参数传递给get...Attribute()函数(至少据我所知),但是引用当前$this(称为User)的$driver是受支持的,因此您可以重构:

public function getLastFreeTimeAttribute(){ 
  return UserController::lastFreeTime($this->id); 
}

sortBy()方法可以正常工作,但是由于last_free_timenull,所以它没有做任何明显的事情。现在应该可以正常工作了。