通过Laravel 5.4中的一对一数据透视表获取属性

时间:2017-05-18 10:09:47

标签: database laravel eloquent relationship one-to-one

我有一个名为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对象内的特定主题内?

2 个答案:

答案 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}}与该主题相关联,希望这正是您所寻找的。