Сделать возврат из нескольких функций создания Laravel - PullRequest
0 голосов
/ 22 января 2019

Только что закончил php artisan make:auth, В app\Http\Controllers\Auth\RegisterController лежит функция создания по умолчанию:

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

Я добавил в представлении на той же странице этого представления по умолчанию (/register) дату рожденияот другой модели.Как вставить новую функцию создания в ту же функцию создания по умолчанию?

enter image description here

UserInformation::create([
    'user_id' => ???
    'birth_date' => $data['birth_dae']
]);

Как я могу подключить это к вышеуказанному returnутверждение и как я смогу получить только что созданный id из User и передать его в user_id из UserInformation?

Моя идея до сих пор:

protected function create(array $data)
{
    return [
        User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
        ]),
        UserInformation::create([
        'user_id' => ??? // should be the same as the id of the created user
        'birth_date' => $data['birth_date'],
        'color' => "blue"
        ])
    ];
}

Попытка сделать что-то вроде этого:

protected function create(array $data)
{
    $user = new User;
    $user->name = $data['name'];
    $user->email = $data['email'];
    $user->password = Hash::make($data['password']);
    $user->save();

    $user_id = $user->id;

    $user_info = new UserInformation;
    $user_info->user_id = $user_id;
    $user_info->birth_date = $data['birth_date'];
    $user_info->color = "blue";
    $user_info->save();

    return view('home');
}

Но все равно возвращает эту ошибку:

Аргумент 1, передаваемый в Illuminate \ Auth \ SessionGuard :: login () должен реализовывать интерфейс Illuminate\ Contracts \ Auth \ Authenticatable, экземпляр Illuminate \ View \ View данным

РЕДАКТИРОВАТЬ:

Мой хороший друг рекомендовал это:

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'pasword' => Hash::make($data["password"])
    ]);

    UserInformation::create([
        'user_id' => $user->id,
        'birth_date' => $data['birth_date'],
        'color' => 'blue'
    ]);

    return $user;
}

И в моей модели UserInformation:

protected $fillable = ["user_id", "birth_date", "color"];

1 Ответ

0 голосов
/ 22 января 2019

Если я правильно помню, return Model::create(...); просто вернет true или false (или умрет при ошибке) в зависимости от результата функции create(), поэтому мы можем настроить код для обработки этого.Попробуйте следующее:

protected function create(array $data){
  \DB::beginTransaction();

  try {
    $user = User::create([
      "name" => $data["name"],
      "email" => $data["email"],
      "password" => Hash::make($data["password"])
    ]);

    $userInformation = UserInformation::create([
      "user_id" => $user->id,
      "birth_date" => $data["birth_date"],
      "color" => "blue"
    ]);
  } catch(\Exception $ex){
    \DB::rollBack();
    \Log::error("Error creating User and UserInformation: ".$ex->getMessage());

    return false;
  }

  \DB::commit();

  return true;
}

Установив $user в результате User::create(), вы можете использовать $user->id в последующем UserInformation::create().Также я рекомендую использовать транзакции при сохранении зависимых записей.Если User::create() успешен, а UserInformation::create() неуспешен, вы не получите User без UserInformation, так как вся транзакция откатывается при сбое и сохраняется в базе данных при успешном завершении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...