如何在Laravel的三个表的雄辩模型中定义一对多和多对多关系?
我有三张桌子:如何在Laravel的三个表的雄辩模型中定义一对多和多对多关系?,laravel,eloquent,laravel-5.5,Laravel,Eloquent,Laravel 5.5,我有三张桌子: 计划 版本 补丁 这些关系是: 项目->版本(一对多) 版本修补程序(多对多) 请参见简化模型: 我需要显示一个项目的所有补丁。我可以这样做: @foreach( $project->versions as $version) @foreach( $version->patches as $patch) {{ $patch->something }} @endforeach @endforeach 当然,它会多
- 计划
- 版本
- 补丁
- 项目->版本(一对多)
- 版本修补程序(多对多)
@foreach( $project->versions as $version)
@foreach( $version->patches as $patch)
{{ $patch->something }}
@endforeach
@endforeach
当然,它会多次显示适用于多个版本的补丁
如何在模型中定义此关系并删除重复的面片?我在寻找这样的东西(模型\应用\项目):
我的模型中有以下方法: 项目
public function versions()
{
return $this->hasMany('App\Version', 'projects_id');
}
版本
public function project()
{
return $this->belongsTo('App\Project', 'projects_id');
}
public function patches()
{
return $this->belongsToMany('App\Patch', 'versions_patches', 'versions_id', 'patches_id');
}
补丁
public function versions()
{
return $this->belongsToMany('App\Version', 'versions_patches', 'patches_id', 'versions_id');
}
在项目模型中:
public function versions()
{
return $this->hasMany('App\Version');
}
public function versions()
{
return $this->hasMany('App\Patch');
}
public function versions()
{
return $this->belongsToMany('App\Patch');
}
在您的版本模型中:
public function versions()
{
return $this->hasMany('App\Version');
}
public function versions()
{
return $this->hasMany('App\Patch');
}
public function versions()
{
return $this->belongsToMany('App\Patch');
}
在您的补丁模型中:
public function versions()
{
return $this->hasMany('App\Version');
}
public function versions()
{
return $this->hasMany('App\Patch');
}
public function versions()
{
return $this->belongsToMany('App\Patch');
}
显示项目的所有文件包:(您的代码是正确的!)
但是上面的代码将产生N+1问题,因此您需要提前加载关系
$projects = App\Project::with('versions.patches')->get();
Patch.php:
public function versions()
{
return $this->belongsToMany('App\Version','versions_patches','patches_id','versions_id');
}
版本型号:
public function projects()
{
return $this->hasMany('App\Project');
}
然后
$projectPatches = $patches->whereHas('versions_id', function($q) use ($project) {
return $q->where('projects_id',$project->version);
})->get();
高质量问题(+1),缺少关于Laravel版本的更多信息,请添加适当的标签。另外,不要使用嵌套的
foreach
语句,因为您正面临一个n+1问题,请快速研究一下。@Kyslik确实如此;)不要鼓励人们使用嵌套的foreach
,展示高质量的代码,这意味着展示如何快速加载。@Kyslik-Ah。谢谢在这个问题上,我认为嵌套foreach在这里是无法避免的,只需说明需要什么来避免n+1问题。但是。。。这段代码不会仍然显示重复的补丁,这是OP想要避免的吗?谢谢。我必须对它进行测试,但看起来以下代码是有效的:$patches=Patch::whereHas('versions.project',function($query)use($project){$query->where('projects.id',$project->id);})->get();