Laravel 5 leftJoin 属于关系

Jan*_*ans 5 php laravel

我有两个数据库表:用户和学生。学生是用户,但拥有额外的数据(地址)。我的学生模型中有一个 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 模型中定义),并且无法再查询用户的关系。

我怎样才能以干净的方式实现这一目标?

Jar*_*zyk 0

$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并且只是获取了所有字段。

  • 我的意思是,使用 leftJoin() 时,我必须将“虚拟名称字段”重写为 sql concat,而我已经在用户模型中定义了它,所以这是双重代码而不是 DRY。理想的情况是这样做:$this->student->with(user, 'left join')->first()。有办法实现吗? (2认同)