Originally posted @ https://codeanddeploy.com посетите и загрузите код примера:
https://codeanddeploy.com/blog/laravel/laravel-8-hasone-example
В этой заметке я поделюсь с вами примером использования метода Laravel 8 hasOne() в отношениях модели. В моем предыдущем руководстве я рассказал, как реализовать отношения Laravel один-к-одному, которые используются для связи между записями в двух таблицах, где каждая запись в каждой таблице отображается только один раз.
Метод Laravel hasOne() очень полезен при реализации отношений Laravel один-к-одному, который используется для получения связанных записей с помощью динамических свойств Eloquent.
Давайте создадим две таблицы, которые связаны друг с другом. Где таблица пользователя содержит контактную информацию.
Шаг 1: Создаем миграцию для нашего тестирования Laravel hasOne()
В этом примере мы просто создадим миграцию для нашей таблицы user_contact_infos
, поскольку мы будем использовать таблицу users по умолчанию.
Выполните следующую команду:
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 artisan migrate
Я предполагаю, что таблица users
уже включена.
Далее давайте применим метод Laravel hasOne() к нашей модели.
Шаг 2: Применение метода Laravel 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.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);
}
}
Как вы видите, мы внедрили метод Laravel hasOne() в наш класс модели User.php внутри метода user_contact_info()
, который является именем нашего связанного класса модели.
Шаг 3: Сохраним запись с помощью Laravel hasOne()
Создание записи пользователя.
// 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 = 'Dumaguete City';
$userContactInfo->phone = '09261234567';
$user->user_contact_info()->save($userContactInfo);
Если у вас есть контактная информация одного пользователя и вы хотите использовать ее другим пользователем, то будет применен приведенный ниже код.
$userContactInfo = UserContactInfo::find(1);
$user = User::find(2);
$userContactInfo->user()->associate($user)->save();
Получить запись Пример:
$userContactInfo = User::find(1)->user_contact_info;
dd($userContactInfo);
Надеюсь, этот учебник поможет вам. Посетите здесь https://codeanddeploy.com/blog/laravel/laravel-8-hasone-example, если вы хотите скачать этот код.
Счастливого кодирования 🙂