- Отношение hasOne
Один к одному
Связь вида «один к одному» является очень простой. К примеру, модель User может иметь один Phone. Чтобы определить такое отношение, мы помещаем метод phone
()
в модель User. Метод phone
()
должен возвращать результат метода hasOne
()
от базового класса модели Eloquent:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * Получить запись с номером телефона пользователя. */ public function phone() { return $this->hasOne('App\Phone'); } }
Первый параметр, передаваемый hasOne
()
, — имя связанной модели. Как только отношение установлено, вы можете получить к нему доступ через динамические свойства Eloquent. Динамические свойства позволяют вам получить доступ к функциям отношений, если бы они были свойствами модели:
$phone = User::find(1)->phone;
Eloquent считает, что внешний ключ отношения называется по имени модели. В данном случае предполагается, что это user_id. Если вы хотите перекрыть стандартное имя, передайте второй параметр методу hasOne
()
:
return $this->hasOne('App\Phone', 'foreign_key');
Также Eloquent подразумевает, что внешний ключ должен иметь значение, привязанное к родительскому столбцу id (или другому $primaryKey). Другими словами, Eloquent будет искать значение столбца id пользователя в столбце user_id записи Phone. Кроме того вы можете передать в метод третий аргумент, чтобы указать свой столбец для объединения:
return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
Создание обратного отношения
Итак, у нас есть доступ к модели Phone из нашего User. Теперь давайте определим отношение для модели Phone, которое будет иметь доступ к User, владеющего этим телефоном. Для создания обратного отношения в модели Phone используйте метод belongsTo
()
:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Phone extends Model { /** * Получить пользователя, владеющего данным телефоном. */ public function user() { return $this->belongsTo('App\User'); } }
В примере выше Eloquent будет искать связь между user_id в модели Phone и id в модели User. По умолчанию Eloquent определяет имя внешнего ключа по имени метода отношения, добавляя суффикс _id. Однако, если имя внешнего ключа модели Phone не user_id, передайте это имя вторым параметром в метод belongsTo
()
:
/** * Получить пользователя, владеющего данным телефоном. */ public function user() { return $this->belongsTo('App\User', 'foreign_key'); }
Если ваша родительская модель не использует id в качестве первичного ключа, или вам бы хотелось присоединить дочернюю модель к другому столбцу, вы можете передать третий параметр в метод belongsTo
()
, который определяет имя связанного столбца в родительской таблице:
/** * Получить пользователя, владеющего данным телефоном. */ public function user() { return $this->belongsTo('App\User', 'foreign_key', 'other_key');