Задать вопрос
@antonov_tag1

Как одновременно сделать две записи в разных таблицах в Laravel?

Добрый день друзья! Пожалуйста помогите мне в понимании такой вещи как одновременное создание записи в двух таблицах..

Например:
Есть таблица User с полем ID, и таблица User_data с полем USER_ID

Как создавая НОВОГО юзера создать запись в таблице User и в таблице User_data - где в поле user_id будет id нового пользователя?

Заранее благодарен вам за помощь)!!
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
Оборачиваем всё в транзакцию, да и всё. И тогда создадутся либо обе записи, либо ни одной. Так мы не расплодим сироток в случае ошибочных данных.

Модели:

<?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. Там вообще такой проблемы нет, и всё делается автоматически.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы