Оборачиваем всё в транзакцию, да и всё. И тогда создадутся либо обе записи, либо ни одной. Так мы не расплодим сироток в случае ошибочных данных.
Модели:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
use HasFactory, Notifiable;
/**
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* Получить данные пользователя, связанные с этим пользователем.
*/
public function userData()
{
return $this->hasOne(UserData::class);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class UserData extends Model
{
use HasFactory;
/**
* @var array<int, string>
*/
protected $fillable = [
'phone_number',
];
/**
* Получить пользователя, которому принадлежат эти данные.
*/
public function user()
{
return $this->belongsTo(User::class);
}
}
Создание записей
use App\Models\User;
use App\Models\UserData;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
DB::transaction(function () {
// 1. Создаем пользователя (User)
$user = User::create([
'name' => 'Вася Пупкин',
'email' => 'uasya@fsb.ru',
'password' => Hash::make('12345'),
]);
// 2. Создаем данные пользователя (UserData) и связываем их с пользователем
$user->userData()->create([
'phone_number' => '112',
]);
});
P.S. ИМХО: ненавижу Eloquent и весь паттерн Active Record. Как по мне, вместо него лучше уж просто чистым SQL пользоваться. А вот если нужна мощная ORM, то уж лучше воспользоваться Doctrine. Там вообще такой проблемы нет, и всё делается автоматически.