【问题标题】:Eloquent sortBy() accessor does not order雄辩的 sortBy() 访问器不排序
【发布时间】: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 行应该排序,但不是。有任何想法吗?提前致谢。

【问题讨论】:

  • 您是否尝试过使用-&gt;sortBy('last_free_time') 之前 -&gt;get()
  • 这会引发对未定义方法 Illuminate\Database\Eloquent\Builder::sortby() 的调用
  • 应该是 sortBy() - 大写 B @MarceloZárate
  • getLastFreeTimeAttribute($driver_id) 不起作用,$driver_id 始终是null。价值应该从哪里来?
  • @TimLewis 请提供它作为答案,以便我标记它。按预期工作,我怎么看不到?非常感谢。

标签: php mysql laravel eloquent laravel-blade


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 2021-12-15
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2018-11-07
    • 2017-04-11
    相关资源
    最近更新 更多