具有多个联接的Laravel模型请求



虽然我可以用Model发出简单的请求,但对于更复杂的请求,我不能这么说。我知道我不一定要使用Model,也可以使用DB facade,但我仍然想知道应该如何做到这一点。

这是我使用DB:提出的一个请求

DB::table('relationships')
->Join('users','users.id','=','relationships.user_id')
->Join('roles','roles.id','=','relationships.role_id')
->Join('bundles','bundles.id','=','relationships.related_id')
->Join('pools','bundles.id','=','pools.bundle_id')
->whereIn('pools.name',$pools)
->whereIn('roles.name',$roles)
->select('users.first_name','users.last_name','users.mail_address','roles.name AS role_name','bundles.name AS bundle_name', 'pools.name AS pool_name')
->get();

在第一次尝试时,我尝试了这个:

User::whereHas('relationships', function($req) use($roles) {
$req->whereHas('bundle', function($req){
$req->whereIn('name', $pools);
});
$req->whereHas('role', function ($req){
$req->whereIn('name', $roles);
});
})
->with('relationships', 'relationships.role:id,name', 'relationships.bundle:id,name')
->get();
}

问题是,使用";用";只需无条件地选择所有内容,忽略先前进行的测试(whereHas,whereIn(。所以我必须再次过滤with语句中的每个表。

然后我做了这个:

$pools = request()->input('pools.*.name');
return $prepReq = User::whereHas('relationships', function($req) use($pools, $roles) {
$req->whereHas('bundle', function($req) use ($pools){
$req->whereHas('pools', function($req) use ($pools){
$req->whereIn('name', $pools);
});
});
$req->whereHas('role', function ($req){
$req->whereIn('name', $roles);
});
})
->with(['relationships' => function ($query) use($pools, $roles){
$query->whereHas('role', function ($query){
$query->whereIn('name', $roles)
->select('id','name');
})->select('id','name');

}])
->get(['id', 'first_name', 'last_name', 'mail_address']);

然后我迷失了方向,放弃了。另一件让我汗流浃背的事情是,当你使用";用";,只能在最后一个表中选择列。

例如:";relationships.bundle.pools"=>我可以在池中选择列,但不能在关系或束中选择列。这是否意味着我必须为每个表叠加语句?

正如你所看到的,我对应该如何做有点一无所知

我想要任何关于此事的建议或帮助

提前感谢您的时间

使用Laravel时,您应该为每个模型设置雄辩的关系

根据您从上面选择的语句,假设您想要获得用户、捆绑包、角色和池,那么我会做以下操作,可能会关闭,这取决于您实际的数据库和模型是如何设置的

// Relationship.php
public function user()
{
return $this->belongsTo(User::class);
}
public function role()
{
return $this->belongsTo(Role::class);
}
public function bundle()
{
return $this->belongsTo(Bundle::class, 'id', 'related_id');
}
// Bundle.php
public function relationship()
{
return $this->hasOne(Relationship::class, 'related_id');
}
// Role.php
public function relationship()
{
return $this->hasOne(Relationship::class);
}
// Pool.php
public function bundle()
{
return $this->belongsTo(Bundle::class);
}

然后你可以做一些类似的事情

Pool::with('bundle.relationship.user')->whereIn('name', $pools);
Role::with('relationship.user')->whereIn('name', $roles);

最新更新