Laravel Eloquent嵌套关系。在控制器变量

时间:2018-03-19 06:31:33

标签: laravel eloquent

我有一些不理想的工作查询,我想尝试以雄辩的方式执行它们来整理它。

我认为我已经正确定义了关系但我无法弄清楚如何编写查询并将它们存储在控制器中的变量中。我需要将这些变量返回给视图,因为我对json进行编码以便在JavaScript中使用。

这是我在控制器中的内容:

public function show($idProject)
  {
    $project = ProjectsModel::with('user')->where('idProjects','=',$idProject)->first();
    $objsettings = ObjSettingsModel::where('idObjSettings','=',$project['ObjSettingsID1'])->first();
    $obj = ObjModel::where('idObjs','=',$objsettings['Objs_idObjs'])->first();

    return view('project')->with('project',$project)->with('obj',$obj)->with('objsettings',$objsettings);
  }

命名约定有点偏,所以这就是它的作用。

我将$ idProject从我索引页面上的一个链接传递给控制器​​,在那里我循环并从Projects表中分页所有行。

第一个查询找到项目行,其中id(idProjects)与通过链接(idProject)从索引页面传递的变量匹配。我还使用雄辩的关系成功从用户表中提取了相关的用户行。

下一个查询来自ObjSettings表,该表存储页面上显示的对象的多个设置值。我将ObjSettings表的idObjSettings列与先前拉出的$ project ['ObjSettingsID1']相匹配,该项目本质上是项目表中的外键。每个项目可以有几个ObjSettings。

第3个查询从Obj表中提取,该表存储有关对象的详细信息。这些是对象的静态详细信息,例如名称或大小。我将idObjs列与先前拉出的$ objsettings ['Objs_idObjs']匹配,后者是ObjSettings表中的外键。一个Obj可以有许多ObjSettings,用于其他项目。

以下是我将php变量传递给JS的方法:

<script>var obj = @json($obj);</script>
<script>var objsettings = @json($objsettings);</script>

这是我的关系

ProjectsModel

public function user()
  {
   return $this->belongsTo('App\User', 'Username', 'id');
  }


public function objsettings()
  {
    return $this->hasMany('App\ObjSettingsModel', 'idObjSettings', 'ObjSettingsID1' );
  }

ObjSettingsModel

public function objs()
    {
     return $this->belongsTo('App\ObjsModel', 'Objs_idObjs', 'idObjs');
    }

public function projects()
    {
     return $this->belongsTo('App\ProjectsModel', 'ObjSettingsID1', 'idObjSettings' );
    }

ObjModel

public function objsettings()
    {
      return $this->hasMany('App\ObjSettingsModel', 'idObjs', 'Objs_idObjs');
    }

我尝试过各种各样的查询,例如:

$project = ProjectsModel::with('user')->with('objsettings.objs')->where('idProjects','=',$idProject)->first();
$objsettings = $project->objsettings; 
$obj = $project->objsettings->objs;

但我一直遇到诸如“此集合实例上不存在”[Property _ objs]的问题。我想我在这种情况下会返回多行?任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

您需要loopobjsettings

$project = ProjectsModel::with('user')->with('objsettings.objs')->where('idProjects','=',$idProject)->first();
$objsettings = $project->objsettings; 
foreach($objsettings as $objsetting){
     $objs = $objsetting->objs;
}