Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel-我如何在一个急切加载的多态关系中按字段排序查询?_Laravel_Eloquent_Eager Loading - Fatal编程技术网

Laravel-我如何在一个急切加载的多态关系中按字段排序查询?

Laravel-我如何在一个急切加载的多态关系中按字段排序查询?,laravel,eloquent,eager-loading,Laravel,Eloquent,Eager Loading,我在用户和承包商之间建立了多态关系: Schema::create('users', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('first_name'); $table->string('last_name'); $table->morphs('user'); }); Schema::create('contractors', fu

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

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
});
App\User

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

public function userable()
{
    return $this->morphTo();
}
public function user()
{
    return $this->morphOne('App\User', 'userable');
}
我们的目标是拥有不同的用户类型,因为承包商可能需要收集其他字段数据,但他们将始终拥有用户表中的所有字段

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

class ContractorController extends Controller
{
    public function all(Request $request)
    {
        return Contractor::with('user')->paginate(15); // order by users.last_name here
    }
}
我已经读到,我必须加入表,但由于某种原因,响应中的user对象返回NULL

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

因为
lastname
是users表的列。您不能将
与('user')
一起使用,也不能按
lastname
排序

但是,您可以使用
join('users',…)
而不是
with(user)

Contractor::join('users'、'contractors.id'、'='、'users.userable_id'))
->orderBy('users.lastname')
->分页(15);
由于使用
join
时存在重复的
id(contractors.id,users.id)
,如果仍然希望将
用户
对象作为属性,可以这样做:

Contractor::join('users'、'contractors.id'、'='、'users.userable_id'))
->orderBy('users.lastname')
->selectRaw('contractors.*,users.lastname'))
->使用('user'))
->分页(15);

使用连接而不是快速加载修复了我遇到的其他几个问题,并使前端的结果集更容易理解。这是我要走的路。谢谢