- Отношение 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');
