Laravel 10 Auto Load More Data on Page Scroll using AJAX Example

Step 1: Install Laravel


   composer create-project laravel/laravel AjaxDataLoad

Step 2 : Database ConfigurationIn this step, we require to make database configuration, you have to add following details on your .env file.

For The Next step, we require to make database configuration,and  you have to add following details on your .env file. 

.env


    DB_HOST=localhost
    DB_DATABASE=homestead
    DB_USERNAME=homestead
    DB_PASSWORD=secret

Step 3: Create Migration


    php artisan make:migration create_posts_table

put bellow code in your migration file for create products table.


    <?php
  
    use Illuminate\Database\Migrations\Migration;
    use Illuminate\Database\Schema\Blueprint;
    use Illuminate\Support\Facades\Schema;
      
    return new class extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->id();
                $table->string('title');
                $table->string('slug');
                $table->text('body');
                $table->timestamps();
            });
        }
        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            Schema::dropIfExists('posts');
        }
    };

Step 4: Create Model

app/Models/Post.php 


    <?php
    
    namespace App\Models;
        
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
        
    class Post extends Model
    {
        use HasFactory;
       
        /**
         * Write code on Method
         *
         * @return response()
         */
        protected $fillable = [
            'title', 'body', 'slug'
        ];
    }

Step 5: Create Factory Class

This step we generate dummy data using factory; this data loads dynamically on page scroll:


php artisan make:factory PostFactory --model=Post

database\factories\PostFactory.php


    <?php
    
    namespace Database\Factories;
        
    use Illuminate\Database\Eloquent\Factories\Factory;
    use App\Models\Post;
    use Illuminate\Support\Str;
        
    /**
     * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Post>
     */
    class PostFactory extends Factory
    {
        /**
         * The name of the factory's corresponding model.
         *
         * @var string
         */
        protected $model = Post::class;
          
        /**
         * Define the model's default state.
         *
         * @return array
    
         */
        public function definition(): array
        {
            return [
                'title' => $this->faker->text(),
                'slug' => Str::slug($this->faker->text()),
                'body' => $this->faker->paragraph()
            ];
        }
    }

 execute the below commands to generate the test data:


php artisan tinker

    Post::factory()->count(20)->create()

Step 6: Create Route

routes/web.php 


<?php
  
  use Illuminate\Support\Facades\Route;
    
  use App\Http\Controllers\PostController;
     
  /*
  |--------------------------------------------------------------------------
  | Web Routes
  |--------------------------------------------------------------------------
  |
  | Here is where you can register web routes for your application. These
  | routes are loaded by the RouteServiceProvider within a group which
  | contains the "web" middleware group. Now create something great!
  |
  */
      
  Route::get('posts',[PostController::class,'index'])->name('posts.index');

Step 7: Create Controller

app/Http/Controllers/PostController.php 


<?php
     
namespace App\Http\Controllers;
     
use Illuminate\Http\Request;
use App\Models\Post;
     
class PostController extends Controller
{
  
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index(Request $request)
    {
        $posts = Post::paginate(10);
  
        if ($request->ajax()) {
            $view = view('data', compact('posts'))->render();
  
            return response()->json(['html' => $view]);
        }
  
        return view('posts', compact('posts'));
    }
}

Step 8: Create View File

resources/views/posts.blade.php 


<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>Laravel Load More on Scroll Example - webthestuff.com</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css">
</head>
<body>
      
<div class="container mt-5" style="max-width: 750px">
  
    <h1>Laravel Load More on Scroll Example - webthestuff.com</h1>
  
    <div id="data-wrapper">
        @include('data')
    </div>
  
    <!-- Data Loader -->
    <div class="auto-load text-center" style="display: none;">
        <svg version="1.1" id="L9" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
            x="0px" y="0px" height="60" viewBox="0 0 100 100" enable-background="new 0 0 0 0" xml:space="preserve">
            <path fill="#000"
                d="M73,50c0-12.7-10.3-23-23-23S27,37.3,27,50 M30.9,50c0-10.5,8.5-19.1,19.1-19.1S69.1,39.5,69.1,50">
                <animateTransform attributeName="transform" attributeType="XML" type="rotate" dur="1s"
                    from="0 50 50" to="360 50 50" repeatCount="indefinite" />
            </path>
        </svg>
    </div>
</div>
  
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
    var ENDPOINT = "{{ route('posts.index') }}";
    var page = 1;
  
    /*------------------------------------------
    --------------------------------------------
    Call on Scroll
    --------------------------------------------
    --------------------------------------------*/
    $(window).scroll(function () {
        if ($(window).scrollTop() + $(window).height() >= ($(document).height() - 20)) {
            page++;
            infinteLoadMore(page);
        }
    });
  
    /*------------------------------------------
    --------------------------------------------
    call infinteLoadMore()
    --------------------------------------------
    --------------------------------------------*/
    function infinteLoadMore(page) {
        $.ajax({
                url: ENDPOINT + "?page=" + page,
                datatype: "html",
                type: "get",
                beforeSend: function () {
                    $('.auto-load').show();
                }
            })
            .done(function (response) {
                if (response.html == '') {
                    $('.auto-load').html("We don't have more data to display :(");
                    return;
                }
  
                $('.auto-load').hide();
                $("#data-wrapper").append(response.html);
            })
            .fail(function (jqXHR, ajaxOptions, thrownError) {
                console.log('Server error occured');
            });
    }
</script>
</body>
</html>

resources/views/data.blade.php


    @foreach ($posts as $post)
    <div class="card mb-2"> 
        <div class="card-body">{{ $post->id }} 
            <h5 class="card-title">{{ $post->title }}</h5>
            {!! $post->body !!}
        </div>
    </div>
    @endforeach

Run Laravel App:


    php artisan serve

Now, Go to browser, type the given URL and view the output:


http://localhost:8000/posts