Laravel 仅获取多对多关系中的数据透视列
Laravel fetch only pivot columns in many to many relationship
我有一个 User
模型,它通过枢轴模型 UserTrainingSection
与 Section
模型相关。我有一个枢轴 table 存储两个 table 的外键,称为 section_user
.
我有 2 个额外的主元 table 列,分别称为 completed
和 completed_date
。
我遇到的问题是,当我获取数据时,它 return 包含 User
模型中的所有列以及其他数据透视列。
class Section extends Model
{
public $table = "sections";
public $fillable = [
'id',
'name',
'description',
'parent',
'position',
'completion_percentage'
];
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
}
}
在我的 API 服务中,我这样获取数据:
Section::with(['users' => function ($q) {
$q->where('users.id', Auth::user()->id);
}])->first();
如何仅 return 数据透视表 table 列并从用户 table 中排除这些列?
目前 return 是这样的:
"sections": [
{
"id": 2,
"name": "Subsection 1 training",
"description": null,
"parent": 1,
"position": 2,
"completion_percentage": null,
"created_at": "2018-05-04 09:54:09",
"updated_at": "2018-05-11 09:14:59",
"users": [
{
"id": 1,
"name": "Test",
"email": "test@test.com",
"created_at": "12-04-2018 14:51:42",
"updated_at": "2018-04-19 14:14:36",
"pivot": {
"section_id": 2,
"user_id": 1,
"completed": 1,
"completed_date": "31/05/2018",
"expires": "31/05/2019"
},
}
]
}
]
我想return是这样的:
"sections": [
{
"id": 2,
"name": "Subsection 1 training",
"description": null,
"parent": 1,
"position": 2,
"completion_percentage": null,
"created_at": "2018-05-04 09:54:09",
"updated_at": "2018-05-11 09:14:59",
"users": [
{
"pivot": {
"section_id": 2,
"user_id": 1,
"completed": 1,
"completed_date": "31/05/2018",
"expires": "31/05/2019"
}
}
]
}
]
所以我基本上摆脱了我不想要的用户数据,只有 return 数据透视数据。
在您的 with
语句中,您根据定义获取所有 User
数据。
您可以添加 select
语句以仅获得您想要的结果。您可以将其添加到模型的关系中,或者在 API.
中访问模型的位置
示例 1:
Section::with(['users' => function ($q) {
$q->where('users.id', Auth::user()->id)->select('completed', 'completed_date');
}])->first();
示例 2:
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date')->select('completed', 'completed_date');
}
(未测试)
根据您的预期输出,我猜您只需要来自连接模型的数据,如果是这种情况,我建议您定义 Section
和 UserTrainingSection
的直接映射
class Section extends Model
{
public function training_users()
{
return $this->hasMany('App\Models\UserTrainingSection', 'section_id');
}
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
}
}
在查询中你可以简单地做
Section::with('training_users')->first();
我有一个 User
模型,它通过枢轴模型 UserTrainingSection
与 Section
模型相关。我有一个枢轴 table 存储两个 table 的外键,称为 section_user
.
我有 2 个额外的主元 table 列,分别称为 completed
和 completed_date
。
我遇到的问题是,当我获取数据时,它 return 包含 User
模型中的所有列以及其他数据透视列。
class Section extends Model
{
public $table = "sections";
public $fillable = [
'id',
'name',
'description',
'parent',
'position',
'completion_percentage'
];
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
}
}
在我的 API 服务中,我这样获取数据:
Section::with(['users' => function ($q) {
$q->where('users.id', Auth::user()->id);
}])->first();
如何仅 return 数据透视表 table 列并从用户 table 中排除这些列?
目前 return 是这样的:
"sections": [
{
"id": 2,
"name": "Subsection 1 training",
"description": null,
"parent": 1,
"position": 2,
"completion_percentage": null,
"created_at": "2018-05-04 09:54:09",
"updated_at": "2018-05-11 09:14:59",
"users": [
{
"id": 1,
"name": "Test",
"email": "test@test.com",
"created_at": "12-04-2018 14:51:42",
"updated_at": "2018-04-19 14:14:36",
"pivot": {
"section_id": 2,
"user_id": 1,
"completed": 1,
"completed_date": "31/05/2018",
"expires": "31/05/2019"
},
}
]
}
]
我想return是这样的:
"sections": [
{
"id": 2,
"name": "Subsection 1 training",
"description": null,
"parent": 1,
"position": 2,
"completion_percentage": null,
"created_at": "2018-05-04 09:54:09",
"updated_at": "2018-05-11 09:14:59",
"users": [
{
"pivot": {
"section_id": 2,
"user_id": 1,
"completed": 1,
"completed_date": "31/05/2018",
"expires": "31/05/2019"
}
}
]
}
]
所以我基本上摆脱了我不想要的用户数据,只有 return 数据透视数据。
在您的 with
语句中,您根据定义获取所有 User
数据。
您可以添加 select
语句以仅获得您想要的结果。您可以将其添加到模型的关系中,或者在 API.
示例 1:
Section::with(['users' => function ($q) {
$q->where('users.id', Auth::user()->id)->select('completed', 'completed_date');
}])->first();
示例 2:
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date')->select('completed', 'completed_date');
}
(未测试)
根据您的预期输出,我猜您只需要来自连接模型的数据,如果是这种情况,我建议您定义 Section
和 UserTrainingSection
class Section extends Model
{
public function training_users()
{
return $this->hasMany('App\Models\UserTrainingSection', 'section_id');
}
public function users()
{
return $this->belongsToMany(User::class, 'section_user')->using('App\Models\UserTrainingSection')->withPivot('completed', 'completed_date');
}
}
在查询中你可以简单地做
Section::with('training_users')->first();