Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Junior Eloquent

Де лежить зовнішній ключ у зв'язках hasMany і belongsTo?

Зовнішній ключ завжди лежить у таблиці тієї моделі, що належить іншій. Звідси й вибір методу.

// posts.user_id посилається на users.id
class User extends Model
{
    public function posts(): HasMany
    {
        return $this->hasMany(Post::class);   // ключ у чужій таблиці
    }
}

class Post extends Model
{
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class); // ключ у своїй таблиці
    }
}

Просте правило: у якій моделі колонка *_id, та модель і пише belongsTo. Інша сторона - hasOne чи hasMany.

Імена за замовчуванням:

  • hasMany шукає в posts колонку user_id - ім'я моделі-власника в snake_case плюс _id;
  • belongsTo бере ім'я методу плюс _id: метод author() шукатиме author_id, і тоді ключ доведеться передати явно, якщо колонка називається інакше.
public function author(): BelongsTo
{
    return $this->belongsTo(User::class, 'user_id');
}

Часта помилка новачків - написати hasOne там, де потрібен belongsTo, бо «в пості є один автор». Запит тоді шукатиме users.post_id, якого не існує.

Докладніше в документації: Зворотний бік один до багатьох

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання