尝试使行按日期排序时结果不正确

时间:2018-11-28 09:22:16

标签: laravel eloquent laravel-5.7

我有自定义代码,可让用户按updated_at列进行订购:

$customers = \App\Customer::whereHas('user', function ($query) {
   $query->orderBy('updated_at', 'DESC');
})->get();

表格方案:

 Schema::create('customers', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('user_id');
    $table->foreign('user_id')
          ->references('id')
          ->on('users')
          ->onDelete('cascade');
    $table->string('name')->nullable();
    $table->string('lastname')->nullable();
    $table->string('surname')->nullable();
    $table->text('about')->nullable();
    $table->timestamps();
});

您可以查看here查询结果。为什么我得到错误的结果或我的查询不正确?

4 个答案:

答案 0 :(得分:0)

假设您要对客户而不是user关系进行排序,则必须在orderBy结果上使用Customer

$customers = \App\Customer::whereHas('user')
                            ->orderBy('updated_at', 'DESC')
                            ->get();

由于您不想订购用户,因此不需要使用whereHas()。简单的has()应该可以:

$customers = \App\Customer::has('user')
                            ->orderBy('updated_at', 'DESC')
                            ->get();

答案 1 :(得分:0)

尝试此查询:

$customers = \App\Customer::whereHas('user', function ($query) {
             $query->orderBy('users.updated_at', 'DESC');
        })->get();

答案 2 :(得分:0)

实际上,我怀疑您也在尝试按顺序检索该关系。您需要急于加载,订购并使用has:

$customers = \App\Customer::with(['user' => function ($query) {
   $query->orderBy('updated_at', 'DESC');
})->whereHas('user')->get();

这应该获得关系并过滤掉所有没有用户的客户。

答案 3 :(得分:0)

尝试此查询,也许它对您有用:

$query = App\Customer::join('users as user', 'user.id', '=', 'customers.user_id')
                     ->orderBy('user.updated_at', 'desc')
                     ->select('customers.*')->get();