2016-11-29 2 views
2

Я создаю приложение в Laravel 5.Laravel: Обеспечение один на один отношений

Приложения Я создаю это набор веб-сайт, где кандидат должен заполнить множество форм. Поскольку существует много полей, я решил логически разбить таблицу users на множество меньших таблиц с отношениями один к одному.

Например, две такие таблицы могут выглядеть следующим образом:

пользователей

  • ID
  • роль (например, администратор или кандидат)
  • first_name
  • фамилия
  • д.р.

driving_licences

  • ID
  • идентификатор_пользователя (FK для пользователей)
  • has_licence
  • NUMBER_OF_POINTS
  • licence_number

В приведенном выше простом случае users имеет отношение отношение к driving_licences. Другими словами, каждая модель User ДОЛЖНА иметь одну соответствующую модель DrivingLicence.

Создание вышеуказанной таблицы и соответствующих моделей Eloquent достаточно просто. Однако я борюсь за лучший подход к обеспечению того, чтобы каждый пользователь (или каждый пользователь, являющийся кандидатом) имел соответствующий DrivingLicence.

Решение я в настоящее время, когда я использую что-то из DrivingLicence я сначала проверить, если связь существует, и создать его, если он не нравится так:

if ($user->drivingLicence === null) { 
    $drivingLicence = new DrivingLicence(); 
    $drivingLicence->user_id = $user->id; 
    $drivingLicence->save(); 
} 

Это должно быть сделано каждый раз, когда я нужно что-то сделать с DrivingLicence, что, конечно же, создает много повторений.

Таким образом, мой вопрос заключается в том, как я могу обеспечить, чтобы между 1 users и driving_licences в Ларавеле существовали отношения один к одному.

+0

Это, скорее всего, не лучший способ, но может привести вас к правильному пути: создайте функцию внутри вашей модели User, чтобы проверить, равна ли лицензия. Если это так, создайте и сохраните новую лицензию для пользователя. '$ User-> checkLicense()'. В 'checkLicense()' сделайте свой чек для 'null', либо создайте, либо выберите лицензию и верните лицензию. Чтобы быть ясным, это уменьшает необходимость постоянно переписывать проверку лицензии и переводит ее на функцию внутри вашей модели. –

+0

Кроме того, идея «обеспечить соблюдение» требуемой лицензии при создании пользователя создает пустую лицензию для сохранения при сохранении пользователя. Затем после факта вы можете заполнить правильные данные. Вам больше не нужно будет проверять, существует ли лицензия, поскольку вы создали ее при создании пользователя. –

ответ

0

Я думаю, что заставить пользователя иметь лицензию - это неправильная цель в первую очередь. Вполне возможно, что у пользователя нет водительских прав, и вместо того, чтобы использовать поле has_license, чтобы указать на это, просто не создавайте для них водительские права.

Подумайте об этом в реальном сценарии. У людей, у которых нет водительских прав, также нет карты, в которой говорится, что у них нет лицензии. Это в основном то, что вы моделируете с помощью текущей схемы базы данных. Вместо этого у них просто ничего нет, поэтому опустите запись driving_licenses.

Ваш User модель может затем такой метод, как hasDrivingLicense() со следующей реализацией:

public function hasDrivingLicense() 
{ 
    return $this->drivingLicense !== null; 
} 

Я понимаю, что это не отвечает на прямой вопрос, но это выделился мне как немного кода запах.

+1

OK да для этого примера. Но для некоторых других таблиц, таких как 'next_of_kin' или' documents', это важно. –

Смежные вопросы