如何从与Eloquent的嵌套关系中加载特定字段?

时间:2015-03-25 19:01:49

标签: php laravel eloquent

我有Order模型属于User且有Revision s。

当我尝试加载订单时,包括:来自其用户的'id''name'字段以及来自整个修订版的某些字段(包括'user_id'字段),我这样做:

return Order::with(array('user' => function ($query) {
    $query->select('id','name');
    }), 'revisions' => function ($query) {
        $query->select('id','created_at','user_id','operation','text');
    })->get();

但是,我想获取用户的名称,它自然位于users'name'字段。

关系设置

顺序

  public function user() {

    return $this->belongsTo('User');
  }


  public function revisions() {
    return $this->hasMany('Revision');
  }

修订

  public function order() {

    return $this->belongsTo('Order');
  }

用户

  public function orders() {
        return $this->hasMany('Order');
  }

  public function revisions() {
     return $this->hasMany('Revision');
   }

预期结果

为了快速输入原因,我将其表示为JS对象......

orders = [

  { id: 5,
    user: {....},
    revisions: [
      { id:100,
        operation: 'Creation',
        text: 'Please provide soon',
        user: 'John Doe'  // Here I got the name instead of a user_id
      }
    ]
  },

  {...}
]

我该如何完成?

注意

我在每个模特都做了正确的关系设置。

1 个答案:

答案 0 :(得分:3)

好吧,你在user_id得到revisions,因为它是修订本身的属性,你应该在Order对象中查找用户名

$x = Order::with(array('user' => function ($query) {
    $query->select('id','name');
    }), 'revisions' => function ($query) {
        $query->select('id','created_at','user_id','operation','text');
    })->get();
var_dump($x->user->name);

$x->user是关系模型,user->name是其属性

所以,要在revision中使用它,你必须做类似的事情:

$x->each(function(&$order) { 
   $order->revisions->each(function(&$rev) use ($order) {
      $rev->setUsername($order->user->name);
   });
});

假设您的setUsername模型中有relation方法。在任何情况下,username模型中的relation应该是私有属性,而不是可填充字段,因为它不是表的一部分,在这种情况下,您必须检查它是否在您导出时做一个->toJson()