Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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_Laravel 5.5 - Fatal编程技术网

如何在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();