从belongsTo关系添加特定属性

时间:2015-06-05 17:02:17

标签: laravel

我希望我的返回对象看起来像这样:

{
    id: "1",
    category_name: "Update Category56945",
    menutype_name: 'some name',
    menutype: {
        name: 'some name',
        ...
    }
}

基本上我想要一个属性(menutype.name)显示在顶层。但无法用这个做到这一点:

$cats = Category::with(['menutype', 'menutype.name as menutype_name'])->get();

我收到错误"调用未定义的方法Illuminate \ Database \ Query \ Builder :: name()"。

以下是我的模型设置(code snippet):

   <?php
        class MenuType extends Eloquent {

            protected $fillable = array('name');

            function category() {
                return $this->hasMany('Category');
            }
        }

        class Category extends Eloquent {

            protected $fillable = array('name','maxitems', 'menutype_id');

            function menutype() {
                return $this->belongsTo('MenuType');
            }
        }

        /*
        * When run this, i want my object looks like this: 
        * 
    {
        id: "1",
        category_name: "Update Category56945",
        menutype_name: 'some name',
        menutype: {
            ....
        }
    }
    */

       $cats = Category::with(['menutype', 'menutype.name as menutype_name'])->get();

// get error
// Call to undefined method Illuminate\Database\Query\Builder::name()

2 个答案:

答案 0 :(得分:2)

在您的类别模型中添加菜单项名称的访问者。

public function getMenutypeNameAttribute($value) {
  return $this->menutype->name;
}

然后您可以加载类别并访问menutype名称。

要将其附加到json,请添加以下内容。

protected $appends = array('menutype_name');

答案 1 :(得分:1)

您需要在select语句中指定它。假设CategoryMenuType表分别为categoriesmenutypes

Category::select('categories.*', 'menutypes.name')
    ->join('menutypes', 'categories.id', '=', 'menutypes.id')
    ->with('menutype')
    ->get();