Как получить комбинацию данных из обеих таблиц в отношениях один к одному в PHP? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть две модели User и Patient. Внешний ключ в таблице пациентов: user_id.

Пользователь

class User extends Authenticatable
{
    public function patient()
    {
       return $this->hasOne(Patient::class);
    }
}

Пациент

class Patient extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Когда я запустил этот скрипт, он не получает данные обеих таблиц

$patient_user = User::find($user->id)->patient;

Результат

{
    "success": {
        "id": 1,
        "user_id": 1,
        "ic": null,
        "gender": null,
        "age": null,
        "height": null,
        "weight": null,
        "allergy": null,
        "created_at": null,
        "updated_at": null
    }
}

Ожидаемый результат

{
    "success": {
        "name": "Mohammad",
        "email": "mohammadnrdn@gmail.com",
        "role": 1,
        "phone_number": null,
        "country_code": null,
        "authy_id": null,
        "verified": "0",
        "ic": null,
        "gender": null,
        "age": null,
        "height": null,
        "weight": null,
        "allergy": null,
        "created_at": "2018-08-28 07:42:16",
        "updated_at": "2018-08-28 07:42:16"
    }
}

Структура

CREATE TABLE `users` (
  `id` int(10) UNSIGNED NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `role` int(11) NOT NULL DEFAULT '1',
  `phone_number` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `country_code` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `authy_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `verified` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT '0',
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `patients` (
  `id` int(10) UNSIGNED NOT NULL,
  `user_id` int(11) UNSIGNED NOT NULL,
  `ic` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `gender` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `height` decimal(8,2) DEFAULT NULL,
  `weight` decimal(8,2) DEFAULT NULL,
  `allergy` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Как этого добиться?

1 Ответ

0 голосов
/ 28 августа 2018

В Laravel есть Ленивая загрузка моделей , что означает, что связанные с моделью модели могут быть загружены после извлечения модели. Поэтому в вашем случае вы можете загрузить пациента:

User::find($user->id)->load('patient')

В противном случае вы можете ограничить готовую загрузку отношение до извлечения модели:

User::with('patient')->find($user->id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...