Метод 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"