РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
183 of 1392 menu

Метод morphOne

Метод morphOne определяет полиморфную связь один-к-одному в Eloquent. Он используется, когда одна модель может принадлежать нескольким другим моделям, но при этом отношение является единственным. Первым параметром передаётся класс связанной модели, вторым - имя поля, содержащего тип родительской модели, третьим - имя поля с идентификатором родительской модели, четвёртым - локальный ключ.

Синтаксис

<?php Model::morphOne(RelatedModel::class, $name, $type, $id, $localKey); ?>

Пример

Давайте создадим полиморфную связь между моделью User и Image, где у пользователя может быть один аватар:

<?php namespace AppModels; use IlluminateDatabaseEloquentModel; use AppModelsImage; class User extends Model { public function avatar(): MorphOne { return $this->morphOne(Image::class, 'imageable'); } } ?>
<?php namespace AppModels; use IlluminateDatabaseEloquentModel; class Image extends Model { protected $fillable = ['url', 'imageable_id', 'imageable_type']; public function imageable(): MorphTo { return $this->morphTo(); } } ?>

Пример

Давайте получим аватар пользователя и выведем его URL:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function showAvatar($userId) { $user = User::findOrFail($userId); $avatar = $user->avatar; if ($avatar) { echo $avatar->url; } else { echo 'default-avatar.jpg'; } } } ?>

Результат выполнения кода при наличии аватара:

"https://example.com/avatars/user-1.jpg"

Результат выполнения кода при отсутствии аватара:

"default-avatar.jpg"

Пример

Давайте создадим аватар для нового пользователя через полиморфную связь:

<?php namespace AppHttpControllers; use AppModelsUser; use AppModelsImage; use IlluminateHttpRequest; class UserController extends Controller { public function createAvatar(Request $request, $userId) { $user = User::findOrFail($userId); $avatar = new Image([ 'url' => $request->input('url'), 'imageable_type' => User::class, ]); $user->avatar()->save($avatar); return response()->json(['message' => 'Avatar created']); } } ?>

Результат выполнения кода:

{"message": "Avatar created"}

Пример

Давайте обновим существующий аватар пользователя:

<?php namespace AppHttpControllers; use AppModelsUser; use IlluminateHttpRequest; class UserController extends Controller { public function updateAvatar(Request $request, $userId) { $user = User::findOrFail($userId); $avatar = $user->avatar; if ($avatar) { $avatar->update(['url' => $request->input('url')]); echo 'Avatar updated'; } else { echo 'Avatar not found'; } } } ?>

Результат выполнения кода:

"Avatar updated"

Смотрите также

  • метод morphMany,
    который определяет полиморфную связь один-ко-многим
  • метод morphTo,
    который определяет обратную полиморфную связь
  • метод hasOne,
    который определяет обычную связь один-к-одному
  • метод save,
    который сохраняет модель через связь
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить