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