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.
Счастливого кодирования 🙂