我需要能够通过通过访问器定义的属性来订购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行应该排序,但不是。有任何想法吗?预先感谢。
答案 0 :(得分:0)
不支持将参数传递给get...Attribute()
函数(至少据我所知),但是引用当前$this
(称为User
)的$driver
是受支持的,因此您可以重构:
public function getLastFreeTimeAttribute(){
return UserController::lastFreeTime($this->id);
}
sortBy()
方法可以正常工作,但是由于last_free_time
是null
,所以它没有做任何明显的事情。现在应该可以正常工作了。