Top 50 Laravel Interview Questions and Answers (Part 2: Eloquent & Advanced)
Advanced interview questions covering Eloquent and complex topics.
Passing data from controllers to views is a fundamental skill in Laravel development. Choosing the right method can make your code cleaner, more maintainable, and easier to debug. In this guide, we'll explore the three most important methods you need to know.
The compact() function is the most commonly used method for passing data to views. It creates an array containing variables and their values.
return view('view-name', compact('variable1', 'variable2'));
Example 1: Passing Single Variable
// In Controller
public function show($id)
{
$user = User::findOrFail($id);
return view('users.profile', compact('user'));
}
// In Blade View (users/profile.blade.php)
<h1>{{ $user->name }}</h1>
<p>Email: {{ $user->email }}</p>
<p>Member since: {{ $user->created_at->format('M Y') }}</p>
Example 2: Passing Multiple Variables
// In Controller
public function dashboard()
{
$user = auth()->user();
$recentPosts = Post::where('user_id', $user->id)
->latest()
->take(5)
->get();
$stats = [
'total_posts' => $user->posts()->count(),
'published_posts' => $user->posts()->published()->count(),
'total_likes' => $user->posts()->withCount('likes')->get()->sum('likes_count')
];
return view('dashboard', compact('user', 'recentPosts', 'stats'));
}
// In Blade View (dashboard.blade.php)
<div class="dashboard">
<h1>Welcome, {{ $user->name }}!</h1>
<div class="stats">
<div class="stat-card">
<h3>Total Posts</h3>
<p class="count">{{ $stats['total_posts'] }}</p>
</div>
<div class="stat-card">
<h3>Published</h3>
<p class="count">{{ $stats['published_posts'] }}</p>
</div>
</div>
<h2>Recent Posts</h2>
@foreach($recentPosts as $post)
<article class="post-preview">
<h3>{{ $post->title }}</h3>
<p>{{ Str::limit($post->excerpt, 100) }}</p>
</article>
@endforeach
</div>
Example 3: With Conditional Data
public function edit(Post $post)
{
$categories = Category::all();
$tags = Tag::all();
$isEdit = true;
return view('posts.form', compact('post', 'categories', 'tags', 'isEdit'));
}
// In Blade View (posts/form.blade.php)
<h1>{{ $isEdit ? 'Edit Post' : 'Create Post' }}</h1>
<form method="POST" action="{{ $isEdit ? route('posts.update', $post) : route('posts.store') }}">
@if($isEdit)
@method('PUT')
@endif
@csrf
<!-- Form fields -->
<select name="category_id">
@foreach($categories as $category)
<option value="{{ $category->id }}"
{{ $post->category_id == $category->id ? 'selected' : '' }}>
{{ $category->name }}
</option>
@endforeach
</select>
</form>
✅ Passing multiple variables
✅ When variable names match view expectations
✅ Clean, readable code
The with() method allows you to chain data passing in a fluent, readable way. It's great for adding individual pieces of data.
return view('view-name')
->with('variable1', $value1)
->with('variable2', $value2);
Example 1: Single Data Point
public function welcome()
{
$featuredPost = Post::published()->latest()->first();
return view('welcome')
->with('featuredPost', $featuredPost);
}
// In Blade View (welcome.blade.php)
@if($featuredPost)
<section class="featured-post">
<h2>Featured Post</h2>
<h3>{{ $featuredPost->title }}</h3>
<p>{{ $featuredPost->excerpt }}</p>
<a href="{{ route('posts.show', $featuredPost) }}">Read More</a>
</section>
@endif
Example 2: Multiple with() Calls
public function home()
{
$latestPosts = Post::published()->latest()->take(3)->get();
$popularCategories = Category::withCount('posts')
->orderBy('posts_count', 'desc')
->take(5)
->get();
$pageTitle = "Home - Welcome to Our Blog";
return view('home')
->with('posts', $latestPosts)
->with('categories', $popularCategories)
->with('title', $pageTitle);
}
// In Blade View (home.blade.php)
@section('title', $title)
<div class="container">
<h1>Latest Posts</h1>
<div class="posts-grid">
@foreach($posts as $post)
<x-post-card :post="$post" />
@endforeach
</div>
<aside class="sidebar">
<h3>Popular Categories</h3>
<ul>
@foreach($categories as $category)
<li>
<a href="{{ route('categories.show', $category) }}">
{{ $category->name }} ({{ $category->posts_count }})
</a>
</li>
@endforeach
</ul>
</aside>
</div>
Example 3: Combining with Additional Data
public function create()
{
$categories = Category::all();
$defaultTags = ['PHP', 'Laravel', 'JavaScript', 'Vue'];
return view('posts.create')
->with('categories', $categories)
->with('defaultTags', $defaultTags)
->with('formTitle', 'Create New Post');
}
// In Blade View (posts/create.blade.php)
<h1>{{ $formTitle }}</h1>
<form method="POST" action="{{ route('posts.store') }}">
@csrf
<div class="form-group">
<label>Category</label>
<select name="category_id" class="form-control">
@foreach($categories as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>
</div>
<div class="form-group">
<label>Tags (Suggestions)</label>
<div class="tag-suggestions">
@foreach($defaultTags as $tag)
<span class="tag-suggestion" onclick="addTag('{{ $tag }}')">
{{ $tag }}
</span>
@endforeach
</div>
</div>
</form>
✅ Adding individual pieces of data
✅ Fluent, readable method chaining
✅ When data needs descriptive names
Pass data directly as an array to the view() helper function. This is straightforward and explicit.
return view('view-name', [
'key1' => $value1,
'key2' => $value2
]);
Example 1: Simple Data Array
public function about()
{
$teamMembers = User::where('role', 'team')->get();
$companyStats = [
'founded' => 2015,
'projects' => 247,
'clients' => 89,
'team_size' => 15
];
return view('about', [
'team' => $teamMembers,
'stats' => $companyStats,
'pageTitle' => 'About Our Company'
]);
}
// In Blade View (about.blade.php)
@extends('layouts.app')
@section('title', $pageTitle)
@section('content')
<section class="company-stats">
<h2>By The Numbers</h2>
<div class="stats-grid">
<div class="stat">
<span class="number">{{ $stats['founded'] }}</span>
<span class="label">Founded</span>
</div>
<div class="stat">
<span class="number">{{ $stats['projects'] }}</span>
<span class="label">Projects</span>
</div>
<!-- More stats -->
</div>
</section>
<section class="team-section">
<h2>Meet Our Team</h2>
<div class="team-grid">
@foreach($team as $member)
<div class="team-member">
<img src="{{ $member->avatar_url }}" alt="{{ $member->name }}">
<h3>{{ $member->name }}</h3>
<p>{{ $member->position }}</p>
</div>
@endforeach
</div>
</section>
@endsection
Example 2: Complex Data Structure
public function analytics()
{
$user = auth()->user();
$analyticsData = [
'views' => [
'total' => 12540,
'this_month' => 1240,
'last_month' => 980,
'change' => '+26.5%'
],
'engagement' => [
'average_time' => '3:45',
'bounce_rate' => '42%',
'pages_per_session' => 2.8
],
'top_posts' => Post::where('user_id', $user->id)
->orderBy('views', 'desc')
->take(5)
->get()
];
return view('analytics.dashboard', [
'analytics' => $analyticsData,
'user' => $user,
'last_updated' => now()->format('M j, Y g:i A')
]);
}
// In Blade View (analytics/dashboard.blade.php)
<div class="analytics-dashboard">
<header class="dashboard-header">
<h1>Analytics for {{ $user->name }}</h1>
<p class="last-updated">Last updated: {{ $last_updated }}</p>
</header>
<div class="metrics-grid">
<div class="metric-card">
<h3>Total Views</h3>
<p class="metric-value">{{ number_format($analytics['views']['total']) }}</p>
<p class="metric-change {{ str_contains($analytics['views']['change'], '+') ? 'positive' : 'negative' }}">
{{ $analytics['views']['change'] }} this month
</p>
</div>
<!-- More metric cards -->
</div>
<section class="top-posts">
<h2>Top Performing Posts</h2>
<table class="posts-table">
@foreach($analytics['top_posts'] as $post)
<tr>
<td>{{ $post->title }}</td>
<td>{{ number_format($post->views) }} views</td>
</tr>
@endforeach
</table>
</section>
</div>
Example 3: Inline Data Creation
public function settings()
{
return view('user.settings', [
'user' => auth()->user(),
'notifications' => [
'email' => true,
'sms' => false,
'push' => true,
'newsletter' => true
],
'privacy_options' => [
'profile_visibility' => 'public',
'show_email' => false,
'search_engine_index' => true
],
'active_tab' => request()->get('tab', 'profile')
]);
}
// In Blade View (user/settings.blade.php)
<div class="settings-container">
<nav class="settings-tabs">
<a href="?tab=profile" class="{{ $active_tab == 'profile' ? 'active' : '' }}">Profile</a>
<a href="?tab=notifications" class="{{ $active_tab == 'notifications' ? 'active' : '' }}">Notifications</a>
<a href="?tab=privacy" class="{{ $active_tab == 'privacy' ? 'active' : '' }}">Privacy</a>
</nav>
<div class="settings-content">
@if($active_tab == 'profile')
<!-- Profile settings form -->
@elseif($active_tab == 'notifications')
<h3>Notification Preferences</h3>
@foreach($notifications as $type => $enabled)
<div class="notification-setting">
<label>
<input type="checkbox" name="notifications[{{ $type }}]"
{{ $enabled ? 'checked' : '' }}>
{{ ucfirst($type) }} Notifications
</label>
</div>
@endforeach
@endif
</div>
</div>
✅ Explicit key-value pairs
✅ Complex data structures
✅ When keys don't match variable names
| Method | Best For | Example |
|---|---|---|
| compact() | Multiple existing variables | compact('user', 'posts', 'stats') |
| with() | Individual data points | with('pageTitle', 'Home') |
| Array Syntax | Explicit key naming | ['page_title' => 'Home'] |
public function complexPage()
{
$baseData = [
'user' => auth()->user(),
'settings' => SiteSettings::first()
];
return view('complex.page', $baseData)
->with('additionalData', $this->getAdditionalData())
->with('cacheTime', now()->addHours(24));
}
public function search()
{
$query = request('q');
$results = [];
$suggestions = [];
if ($query) {
$results = Post::search($query)->get();
$suggestions = $this->getSearchSuggestions($query);
}
$view = view('search', compact('query', 'results'));
if (!empty($suggestions)) {
$view->with('suggestions', $suggestions);
}
return $view;
}
1. What's the difference between compact() and with()?
compact() creates an array from existing variables, while with() allows fluent method chaining to pass individual data points. Both achieve the same result but with different syntax preferences.
2. When would you use array syntax over compact()?
Use array syntax when you need custom keys that don't match variable names, or when building data structures dynamically.
3. Can you chain multiple with() methods?
Yes, with() methods can be chained: view('page')->with('data1', $val1)->with('data2', $val2)
4. How do you pass data to a component?
Use the with() method or pass data as the second parameter to the view() helper, just like regular views.
5. What happens if you pass data with the same key multiple times?
The last value passed will override previous ones. Laravel merges data arrays, with later values taking precedence.
public function show($id)
{
$post = Post::find($id);
if (!$post) {
return view('errors.404', [
'message' => 'Post not found',
'suggestions' => Post::latest()->take(5)->get()
]);
}
return view('posts.show', compact('post'));
}
Now you've mastered the three essential methods for passing data to Laravel views! In our next post, we'll dive into Laravel Database Configuration and .env File Best Practices to learn how to properly set up and manage your database connections.