laravel Отношение один к одному возвращается как один объект - PullRequest
1 голос
/ 10 января 2020

У меня отношение один к одному. Я хотел бы вернуть json данные, в которых модель отношения один к одному отображается как один объект, а не как ребенок.

class User extends Model
{
    protected $fillable = ['email'];

    public function profile() {
        return $this->hasOne(Profile::class);
    }
}

class Profile extends Model
{
    protected $fillable = ['first_name', 'last_name'];
}

Я хочу перенастроить json в контроллере, например:

[
   {
      email: "test@test.test",
      first_name: "Teszt",
      last_name: "Jhon"
   },
   {
      email: "test2@test2.test",
      first_name: "Teszt2",
      last_name: "Jhon2"
   }
]

Но если я сделаю это:

return User::with('profile')->get();

Только получите это:

[
   {
      email: "test@test.test",
      profile: {
         first_name: "Teszt",
         last_name: "Jhon"
      }
   },
   {
      email: "test2@test2.test",
      profile: {
         first_name: "Teszt2",
         last_name: "Jhon2"
      }
   }
]

Как лучше всего получить первый вариант json?

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Вы можете использовать accessor и $appends для достижения этого:

class User extends Model
{
    protected $appends = ['first_name', 'last_name'];
    ...

    public function getFirstNameAttribute() {
        return $this->profile->first_name;
    }

    public function getLastNameAttribute() {
        return $this->profile->last_name;
    }
    ...
}

И тогда

User::get()->toJson();

выдаст:

[
   {
      "email": "test@test.test",
      "first_name": "Teszt",
      "last_name": "Jhon"
   },
   {
      "email": "test2@test2.test",
      "first_name": "Teszt2",
      "last_name": "Jhon2"
   }
]
1 голос
/ 10 января 2020

Если это только для ответа JSON, вы можете использовать ресурс

Создать его, используя

php artisan make:resource UserResource

Затем в методе toArray вашего ресурса настроить то, что будет возвращено:

public function toArray($request)
{
    return [
        'email' => $this->email,
        'first_name' => $this->profile->first_name,
        'last_name' => $this->profile->last_name
    ];
}

Затем вы можете использовать его как:

UserResource::withoutWrapping(); // If you don't want data wrapped in a data entry
return UserResource::collection(User::with('profile')->get());
1 голос
/ 10 января 2020

Если это ответ JSON, вы можете использовать accessors, appends() и hidden() logi c для обработки этого:

$users = User::with('profile')->get();
return response()->json(['users' => $users']);

Затем в вашем User.php Модель:

protected $hidden = ['profile']; // Hide `profile` from `JSON` response
protected $appends ['first_name', 'last_name']; // Auto-append to `JSON` response

// `$user->first_name` in `PHP`, or `user.first_name` in `JSON`
public function getFirstNameAttribute(){
    return $this->profile ? $this->profile->first_name : null;
}

// `$user->last_name` in `PHP`, or `user.last_name` in `JSON`
public function getLastNameAttribute)(){
    return $this->profile ? $this->profile->last_name : null;
}

С этим кодом все записи в массиве users будут выглядеть так, как показано выше.

...