Зовнішній ключ завжди лежить у таблиці тієї моделі, що належить іншій. Звідси й вибір методу.
// 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, якого не існує.