Laravel: How to conditionally render data with Blade

Updated: January 15, 2024 By: Guest Contributor Post a comment

Introduction

Welcome to this comprehensive guide on conditional rendering within the context of Laravel’s Blade templating engine. Blade, known for its elegant syntax and flexibility, is a powerful tool that complements the robustness of the Laravel framework. In this tutorial, we’ll explore various methods of conditionally displaying data and controlling the flow of your templates.

Starting with the basics, we’ll progress to more advanced techniques, ensuring that you have a firm grasp on conditional rendering. We’ll cover Blade directives, such as @if, @unless, @isset, @switch, and other control structures that make your views both readable and maintainable.

Setting Up Your Environment

Before diving into the examples, ensure that you have a working Laravel environment. If not, you can follow the official Laravel documentation to set it up. Once your environment is ready, create a new Blade template to experiment with the examples provided in this tutorial.

Basic Conditional Rendering With @if

One of the most common control structures in any programming language is the if statement. Blade simplifies this with its @if directive. The following example demonstrates its usage:

<!-- resources/views/welcome.blade.php -->
<div>
    @if ($user->isAdmin)
        <p>Welcome, administrator!</p>
    @else
        <p>Welcome, user!</p>
    @endif
</div>

Output:

<div>
    <p>Welcome, administrator!</p>
</div>

If $user->isAdmin evaluates to true, the output will greet the administrator; otherwise, it will greet a regular user.

Using the @unless Directive

Sometimes it’s more readable to express a condition in a negative form. This is where the @unless directive becomes useful:

<!-- resources/views/welcome.blade.php -->
<div>
    @unless ($user->isSubscribed)
        <p>Please subscribe to access premium features.</p>
    @endunless
</div>

Unlike the @if directive, @unless only has one block and is executed if the given condition is false.

Checking for Variable Existence with @isset and @empty

To determine if a variable is set or is empty, you can use the @isset and @empty directives, respectively:

<!-- resources/views/welcome.blade.php -->
<div>
    @isset($message)
        <p>{{ $message }}</p>
    @endisset
    @empty($records)
        <p>No records found.</p>
    @endempty
</div>

Here, if $message is set, its value is displayed. Likewise, if $records is empty or doesn’t exist, the user is informed that there are no records.

Complex Conditions with the @switch Directive

For more complex conditions that would typically require a switch statement in PHP, Blade provides the @switch directive:

<!-- resources/views/welcome.blade.php -->
<div>
    @switch($user->role)
        @case('admin')
            <p>Hello, administrator!</p>
            @break
        @case('editor')
            <p>Hello, editor!</p>
            @break
        @default
            <p>Hello, guest!</p>
    @endswitch
</div>

The @switch directive allows you to compare a variable against several conditions and render the corresponding block of code based on the match.

Using Loops with Conditional Rendering

You can combine loops with conditionals for rendering collections conditionally:

<!-- resources/views/welcome.blade.php -->
<ul>
    @foreach ($users as $user)
        @if ($user->isActive)
            <li>{{ $user->name }} (Active)</li>
        @else
            <li>{{ $user->name }}</li>
        @endif
    @endforeach
</ul>

This loop will display a list of users, highlighting those who are active.

Advanced: Rendering With @forelse and Conditional Components

For scenarios where you need to iterate over a collection and check if it’s empty, you can use the @forelse directive, which combines a loop and a conditional:

<!-- resources/views/welcome.blade.php -->
<ul>
    @forelse ($users as $user)
        <li>{{ $user->name }}</li>
    @empty
        <p>No users found.</p>
    @endforelse
</ul>

In addition to @forelse, you can use conditional Blade components. They can be a powerful way to structure complex conditional logic in your views. For example:

<x-alert type="success" :show="$showAlert">
    Operation successful!
</x-alert>

This code uses a custom Blade component named alert that will only show if $showAlert is true.

Conclusion

Throughout this tutorial, we have explored different ways to conditionally render data in Laravel Blade, from basic conditionals to complex loop and component scenarios. Learn to leverage these techniques to make your templates cleaner and more expressive. As you grow more comfortable with these directives, you’ll find Blade to be an indispensable part of your Laravel toolkit.