我有两个数据库表:用户和学生。学生是用户,但拥有额外的数据(地址)。我的学生模型中有一个 ownTo('User') 关系。
如果我现在像这样查询 Student 模型:
$this->student
->with('user')
->first();
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
{
"id": 1,
"user_id": 12,
"street": "Petershof",
"house_number": "3787",
"postal_code": "8161 NM",
"city": "Tienhoven",
"user": {
"id": 12,
"email": "bvierdag@yahoo.nl",
"first_name": "Nathan",
"last_name": "van Dijk",
"name": "Nathan van Dijk"
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我想展平结果,以便用户字段位于父(学生)对象中。像这样:
{
"id": 1,
"user_id": 12,
"street": "Petershof",
"house_number": "3787",
"postal_code": "8161 NM",
"city": "Tienhoven",
"email": "bvierdag@yahoo.nl", // = user field
"first_name": "Nathan", // = user field
"last_name": "van Dijk", // = user field
"name": "Nathan van Dijk" // = user field
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 leftJoin('users', 'user_id', '=', 'users.id') 而不是 with(),但随后我丢失了我的虚拟属性 'name' (在 User 模型中定义),并且无法再查询用户的关系。
我怎样才能以干净的方式实现这一目标?
$this->student
->leftJoin('users', 'users.id', '=', 'students.user_id')
->select(
'students.*',
'users.email',
'users.first_name',
'users.last_name',
DB::raw("concat(users.first_name, ' ', users.last_name) as name"),
)->first();
Run Code Online (Sandbox Code Playgroud)
您可以像在本例中一样将表放在 select 中users.email。
这些关系将同样工作,我想问题只是用studentsid覆盖usersid,如果您没有指定select并且只是获取了所有字段。
| 归档时间: |
|
| 查看次数: |
10497 次 |
| 最近记录: |