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

How to load specific fields from a nested relationship with Eloquent?

我有一个 Order 模型,它属于 User 并且有 Revision 个。

当我尝试加载订单时,包括:来自其用户的 '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();

但是,我想获取用户的 name,自然是在 users table 作为 '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
      }
    ]
  },

  {...}
]

我怎样才能完成这个?

备注

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

好吧,你在 revisions 中得到 user_id 因为它本身就是一个 属性 修订版,你应该在返回的 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);
   });
});

假设您的 relation 模型中有一个 setUsername 方法。在任何情况下,relation 模型中的 username 应该是私有的 属性,而不是可填写的字段,因为它不是 table 的一部分,在这种情况下你有在执行 ->toJson()

时检查它是否已导出