How to use the @foreach blade directive in Laravel

Blade directives are shortcut codes that help to implement basic PHP control structure. They help makes a code snippets clean and easier to understand. Laravel blade file provides us with the @foreach blade directive that we can use the same way as the foreach loop in PHP. The @foreach directive is more powerful than a normal foreach loop as it also has a $loop variable that is available inside every $foreach loop.

The $loop variable in @foreach blade directive is a stdClass object that provides access to useful meta information regarding the current loop.

You may use a loop variable to iterate though a foreach loop. It helps gain valuable information for the loop. For example if you are in the first or second iteration. An example of how to use the @foreach directive for a loop inside @if conditional statement is shown below.

@if(count($posts) > 1)
    @foreach($posts as $post)
        <h2><a href="/posts/{{$post->id}}">{{$post->title}}</a></h2>
    @endforeach
@else
    </p>no posts found</p>
@endif

The @if directive checks posts count first, if it is more than 1. i.e. there are any posts, then it loops through the posts and shows details of each as shown above. Before using these loop directives, it is essential to confirm if they exist or are more than one so that the loop can be applicable on them and work properly.

The @foreach blade directive helps simplify complex coding logic. However, in cases where we need to assure the user or entity we loop through exists. It is recommended to use the @forelse blade directive.

The code logic behind the @foreach blade directive is as shown below.

/**
     * Compile the for-each statements into valid PHP.
     *
     * @param  string  $expression
     * @return string
     */
    protected function compileForeach($expression)
    {
        preg_match('/\( *(.*) +as *(.*)\)$/is', $expression, $matches);

        $iteratee = trim($matches[1]);

        $iteration = trim($matches[2]);

        $initLoop = "\$__currentLoopData = {$iteratee}; \$__env->addLoop(\$__currentLoopData);";

        $iterateLoop = '$__env->incrementLoopIndices(); $loop = $__env->getLastLoop();';

        return "<?php {$initLoop} foreach(\$__currentLoopData as {$iteration}): {$iterateLoop} ?>";
    }


   /**
     * Compile the for-else statements into valid PHP.
     *
     * @param  string  $expression
     * @return string
     */
    protected function compileForelse($expression)
    {
        $empty = '$__empty_'.++$this->forElseCounter;

        preg_match('/\( *(.*) +as *(.*)\)$/is', $expression, $matches);

        $iteratee = trim($matches[1]);

        $iteration = trim($matches[2]);

        $initLoop = "\$__currentLoopData = {$iteratee}; \$__env->addLoop(\$__currentLoopData);";

        $iterateLoop = '$__env->incrementLoopIndices(); $loop = $__env->getLastLoop();';

        return "<?php {$empty} = true; {$initLoop} foreach(\$__currentLoopData as {$iteration}): {$iterateLoop} {$empty} = false; ?>";
    }

Leave a Comment