Discover how to link related data with just a simple line of code!
Why One-to-one (hasOne, belongsTo) in Laravel? - Purpose & Use Cases
Imagine you have two tables: users and profiles. You want to get each user's profile data manually by writing separate queries and matching IDs yourself.
Manually joining data is slow, repetitive, and easy to mess up. You must write extra code to link tables and keep data consistent, which wastes time and causes bugs.
Laravel's one-to-one relationships (hasOne, belongsTo) let you connect models simply. You write clear code to get related data automatically, saving effort and avoiding mistakes.
$profile = DB::table('profiles')->where('user_id', $user->id)->first();
$profile = $user->profile;
This makes your code cleaner and lets you easily access related data as if it were part of the same object.
When showing a user's page, you can quickly get their profile info like avatar and bio without extra queries or complex code.
Manual data linking is slow and error-prone.
hasOne and belongsTo create clear, automatic connections between models.
Access related data easily and keep your code simple.
Practice
Solution
Step 1: Understand ownership in one-to-one
The model that owns the other model is the one that does not have the foreign key.Step 2: Identify the correct method for ownership
In Laravel, the owning model useshasOneto define the relationship.Final Answer:
hasOne -> Option AQuick Check:
Owning model uses hasOne [OK]
- Using belongsTo on the owning model
- Confusing hasOne with hasMany
- Using belongsToMany for one-to-one
Solution
Step 1: Recall belongsTo syntax
The belongsTo method is used on the model with the foreign key and is called likereturn $this->belongsTo(Model::class);.Step 2: Match the correct syntax
public function user() { return $this->belongsTo(User::class); } matches the correct belongsTo syntax exactly.Final Answer:
public function user() { return $this->belongsTo(User::class); } -> Option AQuick Check:
belongsTo syntax uses belongsTo(Model::class) [OK]
- Using hasOne instead of belongsTo
- Forgetting parentheses after belongsTo
- Using belongsToMany for one-to-one
class User extends Model {
public function profile() {
return $this->hasOne(Profile::class);
}
}
class Profile extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}What will
$user->profile->phone return if the user has a profile with phone number '123-456-7890'?Solution
Step 1: Understand the relationship
User has one Profile, so$user->profilereturns the related Profile model instance.Step 2: Access the phone attribute
Accessing$user->profile->phonereturns the phone value from the Profile model, which is '123-456-7890'.Final Answer:
'123-456-7890' -> Option DQuick Check:
hasOne returns single related model [OK]
- Expecting an array instead of a single model
- Confusing belongsTo and hasOne roles
- Assuming null when profile exists
class Author extends Model {
public function biography() {
return $this->hasOne(Biography::class);
}
}
class Biography extends Model {
public function author() {
return $this->belongsTo(Author::class);
}
}But when you try
$author->biography, it returns null even though the biography exists in the database. What is the most likely cause?Solution
Step 1: Check foreign key conventions
Laravel expects the foreign key in Biography table to be 'author_id' by default for belongsTo.Step 2: Identify mismatch causes null
If the foreign key column is named differently, Laravel cannot find the related record, so$author->biographyreturns null.Final Answer:
The Biography model's foreign key column name doesn't match Laravel's default 'author_id'. -> Option CQuick Check:
Foreign key name mismatch causes null relation [OK]
- Switching hasOne and belongsTo methods incorrectly
- Assuming missing method causes null instead of key mismatch
- Ignoring database schema foreign key names
Car and Engine models where each car has exactly one engine. The engines table has a foreign key car_id. Which is the correct way to define the relationship in both models?Solution
Step 1: Identify foreign key location
The foreign keycar_idis in theenginestable, so Engine belongs to Car.Step 2: Define relationships accordingly
Car has one Engine (hasOne), Engine belongs to Car (belongsTo).Final Answer:
Car uses hasOne, Engine uses belongsTo -> Option BQuick Check:
Foreign key in engines means Engine belongsTo Car [OK]
- Reversing hasOne and belongsTo roles
- Using hasMany for one-to-one
- Using belongsToMany for one-to-one
Ready to prove it?
Pass the test and this pattern moves unknown
