【问题标题】:Laravel - How can I order a query by a field in an eager loaded polymorphic relationship?Laravel - 如何在急切加载的多态关系中按字段排序查询?
【发布时间】:2020-02-29 21:15:27
【问题描述】:

我在用户和承包商之间建立了多态关系:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('first_name');
    $table->string('last_name');
    $table->morphs('user');
});

Schema::create('contractors', function (Blueprint $table) {
    $table->bigIncrements('id');
    //... etc
});

应用\用户

public function userable()
{
    return $this->morphTo();
}

应用\承包商

public function user()
{
    return $this->morphOne('App\User', 'userable');
}

我们的目标是拥有不同的用户类型,因为承包商可能有我们需要收集的其他字段数据,但他们将始终拥有用户表中的所有字段。

我遇到的问题是,在获取所有承包商并急切加载用户数据时,如何按用户表中的 last_name 列排序?

class ContractorController extends Controller
{
    public function all(Request $request)
    {
        return Contractor::with('user')->paginate(15); // order by users.last_name here
    }
}

我读到我必须加入表,但由于某种原因,响应中的用户对象返回 NULL。

class ContractorController extends Controller
{
    public function all(Request $request)
    {
        return Contractor::with('user')
            ->join('users', 'contractors.id', '=', 'users.userable_id')
            ->paginate(15);
    }
}

【问题讨论】:

    标签: laravel eloquent eager-loading


    【解决方案1】:

    因为lastname 是用户表的列。您不能使用with('user') 并通过lastname 订购。

    但是,您可以使用join('users',...) 代替with(user)

    Contractor::join('users', 'contractors.id', '=', 'users.userable_id')
              ->orderBy('users.lastname')
              ->paginate(15);
    

    而且由于在使用join的时候有重复的id(contractors.id, users.id),所以如果还想获取user对象作为属性,可以这样:

    Contractor::join('users', 'contractors.id', '=', 'users.userable_id')
              ->orderBy('users.lastname')
              ->selectRaw('contractors.*, users.lastname')
              ->with('user')
              ->paginate(15);
    

    【讨论】:

    • 使用连接而不是急切加载解决了我遇到的其他几个问题,并使结果集在前端更易于理解。这就是我要走的路。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2014-06-21
    • 2016-06-06
    • 2014-06-12
    • 2017-03-01
    • 2017-01-25
    相关资源
    最近更新 更多