Laravel HasManyThrough 深层关系
Laravel HasManyThrough deep relationship
我有一个多租户设置,其中一个租户 HasMany
个工作区和一个 BelongsToMany
个学生工作区。如何创建与租户的关系,我可以从租户内的所有工作区检索所有学生?
我查看了 hasManyThrough
但这并没有解决问题。现在我有这个功能:
public function getStudents()
{
$this->workspaces()->get()->map(function ($workspace) {
return $workspace->students;
})->flatten()->unique();
}
但我想用关系而不是上面的代码来做。有什么建议吗?
Tenant :HasMany=> Workspace(tenant_id) :BelongsToMany=> Student(student_workspace table)
提前致谢!
您可以通过 join
完成,例如:
public function students(){
return Student::select('students.*')
->join('student_workspace', 'students.id', '=', 'student_workspace.student_id')
->join('workspaces', 'workspaces.id', '=', 'student_workspace.workspace_id')
->join('tenants', 'tenants.id', '=', 'workspaces.tenant_id')
->where('tenants.id', $this->id);
}
或像使用此包的任何正常关系:hasManyDeep 通过以下步骤:
第一个:
composer require staudenmeir/eloquent-has-many-deep
在您的 Workspace
模型文件中:
public function students()
{
return $this->belongsToMany(Student::class, 'student_workspace');
}
在您的 Tenant
模型文件中:
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
class Tenant extends Model
{
use HasFactory, HasRelationships;
public function students(){
return $this->hasManyDeepFromRelations($this->workspaces(), (new Workspace)->students());
}
}
希望这会有所帮助。
我有一个多租户设置,其中一个租户 HasMany
个工作区和一个 BelongsToMany
个学生工作区。如何创建与租户的关系,我可以从租户内的所有工作区检索所有学生?
我查看了 hasManyThrough
但这并没有解决问题。现在我有这个功能:
public function getStudents()
{
$this->workspaces()->get()->map(function ($workspace) {
return $workspace->students;
})->flatten()->unique();
}
但我想用关系而不是上面的代码来做。有什么建议吗?
Tenant :HasMany=> Workspace(tenant_id) :BelongsToMany=> Student(student_workspace table)
提前致谢!
您可以通过 join
完成,例如:
public function students(){
return Student::select('students.*')
->join('student_workspace', 'students.id', '=', 'student_workspace.student_id')
->join('workspaces', 'workspaces.id', '=', 'student_workspace.workspace_id')
->join('tenants', 'tenants.id', '=', 'workspaces.tenant_id')
->where('tenants.id', $this->id);
}
或像使用此包的任何正常关系:hasManyDeep 通过以下步骤:
第一个:
composer require staudenmeir/eloquent-has-many-deep
在您的 Workspace
模型文件中:
public function students()
{
return $this->belongsToMany(Student::class, 'student_workspace');
}
在您的 Tenant
模型文件中:
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
class Tenant extends Model
{
use HasFactory, HasRelationships;
public function students(){
return $this->hasManyDeepFromRelations($this->workspaces(), (new Workspace)->students());
}
}
希望这会有所帮助。