我有一个名为Category的模型。一个类别可以有多个主题。主题只能使用一个框架。但是一个框架可以被多个主题使用。
我的控制器方法:
$category = Category::find(1);
foreach ($category->themes as $theme) {
}
return response()->json(['category' => $category]);
输出:
category: {
id: 1,
name: "DemoCategory",
created_at: null,
updated_at: null,
themes: [
{
id: 1,
frame_id: 1,
created_at: null,
updated_at: null,
pivot: {
category_id: 1,
theme_id: 1
}
}
]
}
主题模型:
public function categories()
{
return $this->belongsToMany('App\Category', 'category_theme');
}
public function frame()
{
return $this->hasOne('App\Frame', 'theme_frame');
}
Fram模型:
empty
如何通过数据透视表连接主题和框架?
正如您所看到的,主题嵌套在JSON对象中。但我也希望特定主题的Frame嵌套在JSON对象中。框架和主题通过数据透视表具有一对一的关系。但是你可以看到它只返回id而不是整个对象。如何将Frame对象嵌套在JSON对象内的特定主题内?
答案 0 :(得分:2)
您不需要使用循环,您可以急切加载关系。
// with only themes
$category = Category::with('themes')->find(1);
//with themes and frame
$category = Category::with('themes.frame')->find(1);
https://laravel.com/docs/5.4/eloquent-relationships#eager-loading
答案 1 :(得分:1)
快速回答是定义两个公共变量,每个模型一个,或者在查询中使用with()方法,如下所示:
类别模型:
public $with = ['themes'];
主题模型:
public $with = ['frame'];
现在,无论何时加载category
模型Category::first();
,您都会加载与之关联的themes
,并且每个theme
都会加载frame
1}}与该主题相关联,希望这正是您所寻找的。 p>