“Один-к-Одному” в Laravel — это не какой-то хитрый фреймворк-колдун, это просто способ сказать базе: «каждому юзеру положен ровно один профиль, и все». Никаких сложных вычислений, триггеров или мистики. Но при этом большинство разработчиков делает так, что потом приходится выдергивать данные через кучу костылей.

Определение отношения

Шаг 1: Две модели

Берем две модели, которые реально нужны. Обычно это User и Profile. Один юзер — один профиль. Просто, да?

Шаг 2: В User

Метод hasOne() в Eloquent — это твоя пушка для связывания моделей.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    // Один юзер — один профиль
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}

Шаг 3: В Profile

Обратно связываем Profile к User. Тут belongsTo(). Всё логично — профиль всегда знает, к какому юзеру он привязан.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    // Профиль знает своего юзера
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

Да, без лишнего пафоса: два метода, и связь работает.

Использование отношения

Получение связанной модели

Когда тебе нужен профиль конкретного юзера — просто дергай свойство:

$user = User::find(1);
$profile = $user->profile; // Профиль юзера 

Все. Не нужно писать SQL руками, Eloquent сам знает, что к чему.

Создание и сохранение связанной модели

Хочешь создать профиль и сразу привязать к юзеру? Делается так:

$user = User::find(1);
$profile = new Profile(['bio' => 'Немного текста о себе.']);
$user->profile()->save($profile); // Привязываем профиль к юзеру 

Главное — не забудь, что save() тут не просто сохранение, а еще и связь выставляет.

Практические моменты

Обращение через свойства — удобно и быстро, но помни: это ленивое получение данных. Если делаешь несколько юзеров с профилями, смотри в сторону with(), чтобы не грузить базу каждый раз.

Создание связанной моделиsave() или create() через отношение — гарантирует, что ключи не потеряются. Попытка делать это руками через profile->user_id = $user->id — рабочая, но рискованная.

Фишка для продвинутыхfirstOrCreate() спасает, когда не знаешь, есть ли профиль. Не надо каждый раз проверять.

Почему это реально удобно

Laravel умеет делать кучу вещей за тебя, но ключевое — не усложнять. Один к одному — простая, понятная штука. Если ты дергаешь профиль через юзера или наоборот, Eloquent берет всю рутину на себя: связывает ключи, строит запросы, проверяет наличие. Не знаешь, есть профиль — создаешь.

Вывод

Один-к-одному — это про четкость и порядок: один юзер, один профиль. Если держать связь через Eloquent, не придется потом рыться в SQL и думать, почему профили теряются. Не усложняй, держи код понятным, пользуйся встроенными методами. И да, это работает реально, без всяких страшилок из документации.