【发布时间】:2019-08-10 01:18:23
【问题描述】:
我需要能够通过访问器定义的属性对集合进行排序。我正在努力解决它,我真的不明白为什么它不能正常工作。
这是我的代码的一些 sn-ps:
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);
}
用户.php
function getLastFreeTimeAttribute($driver_id)
{
return UserController::lastFreeTime($driver_id);
}
用户控制器.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 行应该排序,但不是。有任何想法吗?提前致谢。
【问题讨论】:
-
您是否尝试过使用
->sortBy('last_free_time')之前->get()? -
这会引发对未定义方法 Illuminate\Database\Eloquent\Builder::sortby() 的调用
-
应该是 sortBy() - 大写 B @MarceloZárate
-
getLastFreeTimeAttribute($driver_id)不起作用,$driver_id始终是null。价值应该从哪里来? -
@TimLewis 请提供它作为答案,以便我标记它。按预期工作,我怎么看不到?非常感谢。
标签: php mysql laravel eloquent laravel-blade