Laravel 11 Has Many Through Relationship Example

By Hardik Savani April 16, 2024 Category : Laravel

In this article, I will show you how to use has many through relationship in laravel 11 application. we will use hasManyThrough() method for has many through relationship.

In Laravel, a "Has Many Through" relationship lets you access distant relationships. In our scenario, we have three tables: "users," "posts," and "countries." A user can have many posts, and each post belongs to a country. Using "Has Many Through," we can directly access posts from a country. It simplifies queries, allowing for seamless navigation through multiple related tables.

laravel 11 has many through

Has Many Through Relationship will use "hasManyThrough()" for relation.

Create Migrations:

Now we have to create migration of "users", "posts" and "countries" table. we will also add foreign key with users and posts table. so let's create like as below:

users table migration:

<?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(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->foreignId('country_id')->constrained('countries');
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};

posts table migration:

<?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(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string("name");
            $table->foreignId('user_id')->constrained('users');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

countries table migration:

<?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(): void
    {
        Schema::create('countries', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }
  
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down(): void
    {
        Schema::dropIfExists('countries');
    }
};

Create Models:

Here, we will create Country model. we will also use "hasManyThrough()" for relationship of both model.

Country Model:

<?php
  
namespace App\Models;
  
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
  
class Country extends Model
{
    use HasFactory;

    /**
     * Write code on Method
     *
     * @return response()
     */
    public function posts(): HasManyThrough
    {
        return $this->hasManyThrough(
            Post::class,
            User::class,
            'country_id', /* Foreign key on users table... */
            'user_id', /* Foreign key on posts table... */
            'id', /* Local key on countries table... */
            'id' /* Local key on users table... */
        );
    }
}

Retrieve Records:

<?php
  
namespace App\Http\Controllers;
  
use Illuminate\Http\Request;
use App\Models\Country;
  
class UserController extends Controller
{
    /**
     * Write code on Method
     *
     * @return response()
     */
    public function index(Request $request)
    {
        $country = Country::find(1);    
   
        dd($country->posts);
    }
}

I hope you understand of one to one relationship...

Shares