如何从 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()
时检查它是否已导出
我有一个 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()