通过 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 与该主题相关,希望这就是您要找的。