通过 Laravel 5.4 中的一对一数据透视 Table 获取属性
Get Attributes Through One to One Pivot Table in Laravel 5.4
我有一个名为类别的模型。一个类别可以有多个主题。一个 Theme 只能使用一个 Frame。但是一个Frame可以被多个Theme使用。
我的控制器方法:
$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');
}
帧模型:
empty
如何通过 Pivot 连接主题和框架 table?
如您所见,主题嵌套在 JSON 对象中。但我还希望将特定主题的框架嵌套在 JSON 对象中。框架和主题通过枢轴 table 具有一对一的关系。但是正如您所看到的,它只是 returns id 而不是整个对象。如何获取嵌套在 JSON 对象内特定主题内的 Frame 对象?
不需要使用循环,可以直接加载关系。
// 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
一个快速的答案是定义两个 public 变量,每个模型一个,或者在您的查询中使用 with() 方法,如下所示:
类别模型:
public $with = ['themes'];
主题模型:
public $with = ['frame'];
现在,每当您加载 category
模型(如 Category::first();
)时,您还将加载与其关联的 themes
,并且对于每个 theme
,您将加载frame
与该主题相关,希望这就是您要找的。
我有一个名为类别的模型。一个类别可以有多个主题。一个 Theme 只能使用一个 Frame。但是一个Frame可以被多个Theme使用。
我的控制器方法:
$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');
}
帧模型:
empty
如何通过 Pivot 连接主题和框架 table?
如您所见,主题嵌套在 JSON 对象中。但我还希望将特定主题的框架嵌套在 JSON 对象中。框架和主题通过枢轴 table 具有一对一的关系。但是正如您所看到的,它只是 returns id 而不是整个对象。如何获取嵌套在 JSON 对象内特定主题内的 Frame 对象?
不需要使用循环,可以直接加载关系。
// 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
一个快速的答案是定义两个 public 变量,每个模型一个,或者在您的查询中使用 with() 方法,如下所示:
类别模型:
public $with = ['themes'];
主题模型:
public $with = ['frame'];
现在,每当您加载 category
模型(如 Category::first();
)时,您还将加载与其关联的 themes
,并且对于每个 theme
,您将加载frame
与该主题相关,希望这就是您要找的。