Метод hasOne
Метод hasOne определяет отношение один-к-одному в Eloquent. Он используется для указания, что текущая модель имеет одну связанную модель. Первым параметром передаётся класс связанной модели, вторым - имя внешнего ключа, третьим - имя локального ключа. Если внешний ключ и локальный ключ не указаны, Eloquent использует стандартные соглашения.
Синтаксис
<?php
Model::hasOne(RelatedModel::class, $foreignKey, $localKey);
?>
Пример
Давайте определим отношение между пользователем и его профилем. У пользователя может быть только один профиль:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function profile()
{
return $this->hasOne(Profile::class);
}
}
?>
А теперь получим профиль пользователя с id равным 1:
<?php
use App\Models\User;
$user = User::find(1);
$profile = $user->profile;
echo $profile->bio;
?>
Результат выполнения кода:
"Full-stack developer with 5 years of experience"
Пример
Теперь рассмотрим случай, когда нужно указать внешний ключ и локальный ключ вручную. Предположим, у нас есть модель Phone, связанная с моделью User через поле user_identifier:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function phone()
{
return $this->hasOne(Phone::class, 'user_identifier', 'id');
}
}
?>
Получим номер телефона пользователя:
<?php
use App\Models\User;
$user = User::find(2);
$phone = $user->phone;
echo $phone->number;
?>
Результат выполнения кода:
"+1234567890"
Пример
Метод hasOne также позволяет создавать связанные записи. Создадим новый профиль для пользователя:
<?php
use App\Models\User;
$user = User::find(3);
$profile = $user->profile()->create([
'bio' => 'Laravel developer',
'city' => 'New York'
]);
echo $profile->bio;
?>
Результат выполнения кода:
"Laravel developer"