Как обрабатывать отношения с двумя внешними ключами из одной таблицы в Eloquent? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть таблица Пользователи и Специализация. :

Users:
id (primary, auto increment)
user_id (unique)
hex_id (unique)
status (boolean)

Specialization:
id (primary, auto increment)
user_id (foreign key from users)
hex_id (foreign key from users)
description (text)

Каким должен быть мой тип отношений контроллера между пользователями и специализацией? это один к одному? или или один ко многим?

Проблема в том, что когда я добавляю данные в таблицу специализации во время отправки формы, мой user_id получает автозаполнение из отношения, но не hex_id, что выдает мне ошибку:

..hex_id doesn't have default value..

Возможно ли автоматическое заполнение обоих внешних ключей в таблице специализации только с использованием отношений?

PS Я не могу изменить структуру схемы.

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

мы можем просто добавить значение hax_id до создания записи, в вашей модели Specialization вы можете добавить функцию, как показано ниже. (убедитесь, что удалили все проверки в поле hax_id)

мы можем использовать для этого beforeCreate событие модального режима. если user_id равны hax_id, то мы можем просто назначить его, если в вашем случае он отличается, тогда вы можете выбрать пользователя из БД, используя user_id, получить доступ к hax_id и использовать его. пожалуйста, проверьте код ниже.

use \Backend\Models\User;

// inside your `Specialization` model
public function beforeCreate()
{
    $this->hax_id = $this->user_id;
    // or if its not the case and user_id and hax_id are not same then.
    // $user = User::find($this->user_id);
    // $this->hax_id = $user->hax_id;
}

, таким образом hax_id будет автоматически добавлено в вашу запись. beforeCreate будет работать только при создании записи, вы можете заменить beforeCreate на beforeSave, чтобы это происходило все время при создании и обновлении.

если есть сомнения, прокомментируйте.

1 голос
/ 10 марта 2020

Какой у вас hex_id? это исходит от аутентифицированного пользователя? Также никто не может сказать вам, если это один на один или много на май. Вы должны знать, что вы планируете архивировать здесь. Если у пользователя много специализаций и специализация принадлежит пользователю, то это «Один ко многим». Также вам не нужны user_id и hex_id в пользовательской таблице. Пример ниже основан на вашем объяснении. Если вы поделитесь своим кодом с вашего контроллера, мы сможем вам помочь.

In your USERS Model:

public function specializations()
{
  return $this->hasMany('App\Specialization');
}


In your SPECIALIZATION Model
public function user()
{
  return $this->belongsTo('App\User','user_id');
}`

public function hex()
{
  return $this->belongsTo('App\User','hex_id');
}`
...