Laravel 嵌套预加载特定列
Laravel nested eager load specific columns
我正在使用嵌套预加载,有没有一种方法可以从 account.user.location
中的中间关系中挑选出某些列?
用户模型
public function account(): HasMany
{
return $this->hasMany(Account::class);
}
public function location(): BelongsTo
{
return $this->belongsTo(Location::class);
}
账户模型
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
位置模型
public function user(): HasMany
{
return $this->hasMany(User::class);
}
有效的控制器方法
此方法 returns 嵌套关系,但我想要用户关系中的某些列,而不是全部列出。
public function show(string $id)
{
$film = Film::with([
'account.user.location'
])->findOrFail($id);
}
无效的控制器方法
这是我的示例代码,我试图从用户那里挑选出 name
列,然后显示位置关系。
public function show(string $id)
{
$film = Film::with([
'account.user:id,name',
'account.user.location:id',city
])->findOrFail($id);
}
回应
这是返回的响应,它从不工作的方法中将位置返回为 null
+"account": {#2061
+"id": "191067a6-4c38-423d-a972-bb3a842ca89e"
+"user": {#2064
+"id": "d9f381c1-3899-367c-8d60-6d2bc3db6d23"
+"name": "Domenick"
+"location": null
我不确定我如何从中间关系中挑选出特定的列然后加入该位置。我可以就哪里出错获得帮助吗?
更新您的用户模型
public function account()
{
return $this->hasMany(Account::class, 'user_id');
}
public function location()
{
return $this->belongsTo(Location::class);
}
将您的帐户 class 更新为
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
在你的控制器方法中试试这个
public function show($id)
{
$film = Film::where('id', $id)
->with([
'account.user:id,name',
'account.user.location:id',city
])->get();
}
Laravel 正在加载一个又一个关系级别。换句话说,如果您使用 A::with('b.c')->get()
,那么 Eloquent 将首先加载所有 A
,然后是它们引用的所有 B
,最后是所有 C
s 被加载的 B
s 引用。 ORM 使用导航属性,即外键,来做到这一点。如果在中间模型上省略这些外键,框架将无法再加载引用模型。
如果您手动执行,您将使用以下查询(使用的 ID 和外键是示例):
SELECT * FROM a; // returns As with ids 1, 2, 3
SELECT * FROM b WHERE a_id IN (1, 2, 3); // returns Bs with ids 4, 5, 6
SELECT * FROM c WHERE b_id IN (4, 5, 6);
对于您的情况,使用以下代码应该就足够了:
public function show(string $id)
{
$film = Film::with([
'account.user:id,account_id,location_id,name',
'account.user.location:id,city'
])->findOrFail($id);
}
我正在使用嵌套预加载,有没有一种方法可以从 account.user.location
中的中间关系中挑选出某些列?
用户模型
public function account(): HasMany
{
return $this->hasMany(Account::class);
}
public function location(): BelongsTo
{
return $this->belongsTo(Location::class);
}
账户模型
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
位置模型
public function user(): HasMany
{
return $this->hasMany(User::class);
}
有效的控制器方法
此方法 returns 嵌套关系,但我想要用户关系中的某些列,而不是全部列出。
public function show(string $id)
{
$film = Film::with([
'account.user.location'
])->findOrFail($id);
}
无效的控制器方法
这是我的示例代码,我试图从用户那里挑选出 name
列,然后显示位置关系。
public function show(string $id)
{
$film = Film::with([
'account.user:id,name',
'account.user.location:id',city
])->findOrFail($id);
}
回应
这是返回的响应,它从不工作的方法中将位置返回为 null
+"account": {#2061
+"id": "191067a6-4c38-423d-a972-bb3a842ca89e"
+"user": {#2064
+"id": "d9f381c1-3899-367c-8d60-6d2bc3db6d23"
+"name": "Domenick"
+"location": null
我不确定我如何从中间关系中挑选出特定的列然后加入该位置。我可以就哪里出错获得帮助吗?
更新您的用户模型
public function account()
{
return $this->hasMany(Account::class, 'user_id');
}
public function location()
{
return $this->belongsTo(Location::class);
}
将您的帐户 class 更新为
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
在你的控制器方法中试试这个
public function show($id)
{
$film = Film::where('id', $id)
->with([
'account.user:id,name',
'account.user.location:id',city
])->get();
}
Laravel 正在加载一个又一个关系级别。换句话说,如果您使用 A::with('b.c')->get()
,那么 Eloquent 将首先加载所有 A
,然后是它们引用的所有 B
,最后是所有 C
s 被加载的 B
s 引用。 ORM 使用导航属性,即外键,来做到这一点。如果在中间模型上省略这些外键,框架将无法再加载引用模型。
如果您手动执行,您将使用以下查询(使用的 ID 和外键是示例):
SELECT * FROM a; // returns As with ids 1, 2, 3
SELECT * FROM b WHERE a_id IN (1, 2, 3); // returns Bs with ids 4, 5, 6
SELECT * FROM c WHERE b_id IN (4, 5, 6);
对于您的情况,使用以下代码应该就足够了:
public function show(string $id)
{
$film = Film::with([
'account.user:id,account_id,location_id,name',
'account.user.location:id,city'
])->findOrFail($id);
}