Laravel Одно к одному красноречивые отношения учебник и пример

Originally posted @ https://codeanddeploy.com посетите и скачайте код примера:
https://codeanddeploy.com/blog/laravel/laravel-one-to-one-eloquent-relationship-tutorial-and-example

В этом руководстве вы научитесь реализовывать отношения «один к одному» в Laravel 8. Отношения модели «один к одному» в Laravel — это базовые отношения, с которыми мы обычно сталкиваемся при выполнении проекта Laravel. Если вы новичок в Laravel, этот урок для вас. Я покажу вам пример, который прост для понимания и может помочь вам в ваших будущих проектах на Laravel.

В этом примере мы будем использовать таблицу users и таблицу user_contact_infos, эти таблицы связаны между собой, в которых пользователь имеет контактную информацию с использованием ключа user_id внутри таблицы user_contact_infos.

Для начала нам нужно создать первые таблицы для связи один-к-одному с помощью Laravel eloquent.

Шаг 1: Создание миграции

Поскольку по умолчанию в установках Laravel уже есть таблица users, мы просто пропустим ее и запустим миграцию для нашей таблицы user_contact_infos.

Выполните следующую команду:

php artisan make:migration create_user_contact_infos_table
Войти в полноэкранный режим Выйти из полноэкранного режима

Ниже приведен полный код:

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateUserContactInfosTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('user_contact_infos', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('city');
            $table->string('phone');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('user_contact_infos');
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

В рамках данного руководства я покажу вам также код для миграции таблицы пользователей:

<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Шаг 2: Модели Laravel один к одному

Теперь давайте настроим нашу модель User.php, поскольку она уже включена в установку, нам не нужно выполнять команду:

Смотрите код ниже:

<?php

namespace AppModels;

use AppModelsUserContactInfo;
use LaravelSanctumHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateContractsAuthMustVerifyEmail;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateFoundationAuthUser as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * Get the phone record associated with the user.
     */
    public function user_contact_info()
    {
        return $this->hasOne(UserContactInfo::class);
    }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Как вы можете видеть выше, мы добавили метод user_contact_info() для hasOne(), который является именем нашего связанного класса модели.

Теперь давайте создадим модель UserContactInfo.php. Выполните следующую команду:

php artisan make:model UserContactInfo
Войти в полноэкранный режим Выйти из полноэкранного режима

Ниже приведен полный код нашей модели UserContactInfo.

<?php

namespace AppModels;

use AppModelsUser;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentFactoriesHasFactory;

class UserContactInfo extends Model
{
    use HasFactory;

    /**
     * Get the user that owns the contact info.
     */
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Как вы видите, мы добавили метод user() с методом belongsTo(). Он будет автоматически пытаться найти модель User, которая имеет id, совпадающий с колонкой user_id в модели UserContactInfo.

Теперь мы уже настроили наши модели отношений Laravel «один к одному». Давайте попробуем создать некоторые данные для этого.

Шаг 3: Создание данных для отношений Laravel «один к одному

В этом разделе мы создадим пользователей с контактной информацией пользователя, чтобы протестировать наши отношения Laravel «один к одному».

Создание записи пользователя.

// Create User
$user = new User;
$user->name = 'Juan Dela Cruz';
$user->email = 'juan@gmail.com';
$user->password = bcrypt('password');
$user->save();

$user = new User;
$user->name = 'Juana Santa Cruz';
$user->email = 'juana@gmail.com';
$user->password = bcrypt('password');
$user->save();
Вход в полноэкранный режим Выход из полноэкранного режима

Создание контактной информации пользователя.

$user = User::find(1);

$userContactInfo = new UserContactInfo;
$userContactInfo->city = 'Bayawan City';
$userContactInfo->phone = '09261234567';

$user->user_contact_info()->save($userContactInfo);
Вход в полноэкранный режим Выход из полноэкранного режима

Если у вас есть контактная информация одного пользователя и вы хотите использовать ее другим пользователем, то будет применен приведенный ниже код.

$userContactInfo = UserContactInfo::find(1);

$user = User::find(2);

$userContactInfo->user()->associate($user)->save();
Войти в полноэкранный режим Выйти из полноэкранного режима

Шаг 4: Извлечение отношений Laravel один к одному

Теперь давайте получим записи, используя отношения Laravel «один к одному». Смотрите пример ниже.

$userContactInfo = User::find(1)->user_contact_info;
dd($userContactInfo);
Войти в полноэкранный режим Выход из полноэкранного режима

Я надеюсь, что этот учебник поможет вам. Если вы хотите скачать этот код, посетите здесь https://codeanddeploy.com/blog/laravel/laravel-one-to-one-eloquent-relationship-tutorial-and-example.

Счастливого кодирования 🙂

Оцените статью
Procodings.ru
Добавить комментарий