Eloquent Has One Through Relationship Tutorial in Laravel 11

 <?php


namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        // $users = User::get();
        // return $users;

        // To show All Users details as shown below :
        // $users = User::with("company")->with("phoneNumber")->get();
        // return $users;

        // To show particular User details as shown below :
        // $users = User::with("company")->with("phoneNumber")->find(2);
        // return $users;

        // $users = User::with("company")->with("phoneNumber")->find(2);
        // echo $users->name . "<br>";
        // echo $users->company->company_name . "<br>";
        // echo $users->phoneNumber->number;

        // show All users data in proper format as shown below :
        $users = User::with("company")->with("phoneNumber")->get();
        foreach ($users as $data) {
            echo "<b>Name : </b>" . $data->name . "<br>";
            echo "<b>Company Name : </b>" . $data->company->company_name . "<br>";
            echo "<b>Company Phone Number : </b>" . $data->phoneNumber->number . "<br>";
            echo "<hr>";
        }
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}
Above File is app\Http\Controllers\UserController File





Below File is app\Http\Controllers\CompanyController File
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CompanyController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     */
    public function show(string $id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit(string $id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}





Below File is app\Models\User File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    public $timestamps = false;
    protected $table = "users";
    protected $fillable = ["name", "email"];

    public function company()
    {
        return $this->hasOne(Company::class);
    }

    public function phoneNumber()
    {
        return $this->hasOneThrough(Phone_number::class, Company::class);
    }
}





Below File is app\Models\Company File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Company extends Model
{
    public $timestamps = false;
    protected $table = "companies";
    protected $fillable = ["company_name", "user_id"];
}





Below File is app\Models\Phone_number File
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Phone_number extends Model
{
    public $timestamps = false;
    protected $table = "phone_numbers";
    protected $fillable = ["number", "company_id"];
}





Below File is database\json\users File
[
    {
        "name": "Yahoo Baba",
        "email": "yahoobaba@gmail.com"
    },
    {
        "name": "Salman Khan",
        "email": "salman@gmail.com"
    },
    {
        "name": "Deepika Padukone",
        "email": "deepika@gmail.com"
    },
    {
        "name": "Abhishek Bachchan",
        "email": "abhishek@gmail.com"
    }
]




Below File is database\json\companies File
[
    {
        "company_name": "Tesla",
        "user_id": 1
    },
    {
        "company_name": "Google",
        "user_id": 2
    },
    {
        "company_name": "Microsoft",
        "user_id": 3
    },
    {
        "company_name": "Facebook",
        "user_id": 4
    }
]




Below File is database\json\phone_number File
[
    {
        "number": "55223366",
        "company_id": 1
    },
    {
        "number": "77116688",
        "company_id": 2
    },
    {
        "number": "88997711",
        "company_id": 3
    },
    {
        "number": "33884411",
        "company_id": 4
    }
]





Below File is database\migrations\2024_12_11_095523_create_users_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string("name");
            $table->string("email", 50)->unique();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('users');
    }
};





Below File is database\migrations\2024_12_11_100419_create_companies_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('companies', function (Blueprint $table) {
            $table->id();
            $table->string("company_name");
            $table->unsignedBigInteger("user_id");
            $table->foreign("user_id")->references("id")->on("users")->onUpdate("cascade")->onDelete("cascade");

            // Second way for Making Foreign key as shown below :
            // $table->foreignId("user_id")->constrained("users")->onUpdate("cascade")->onDelete("cascade");
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('companies');
    }
};





Below File is database\migrations\2024_12_11_101616_create_phone_numbers_table File
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('phone_numbers', function (Blueprint $table) {
            $table->id();
            $table->string("number", 15)->unique();
            $table->unsignedBigInteger("company_id");
            $table->foreign("company_id")->references("id")->on("companies")->onUpdate("cascade")->onDelete("cascade");

            // Second way for making Foreign key as shown below :
            // $table->foreignId("company_id")->constrained("companies")->onUpdate("cascade")->onDelete("cascade");
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('phone_numbers');
    }
};





Below File is database\seeders\DatabaseSeeder File
<?php

namespace Database\Seeders;

use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // User::factory(10)->create();

        // User::factory()->create([
        //     'name' => 'Test User',
        //     'email' => 'test@example.com',
        // ]);

        $this->call([
            UserSeeder::class,
            CompanySeeder::class,
            PhoneNumber::class
        ]);
    }
}





Below File is database\seeders\UserSeeder File
<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $json = File::get(path: "database/json/users.json");
        $users = collect(json_decode($json));

        $users->each(function ($user) {
            User::create([
                "name" => $user->name,
                "email" => $user->email
            ]);
        });
    }
}





Below File is database\seeders\CompanySeeder File
<?php

namespace Database\Seeders;

use App\Models\Company;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;

class CompanySeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $json = File::get(path: "database/json/companies.json");
        $companies = collect(json_decode($json));

        $companies->each(function ($company) {
            Company::create([
                "company_name" => $company->company_name,
                "user_id" => $company->user_id
            ]);
        });
    }
}




Below File is database\seeder\PhoneNumberSeeder File
<?php

namespace Database\Seeders;

use App\Models\Phone_number;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\File;

class PhoneNumberSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        $json = File::get(path: "database/json/phone_numbers.json");
        $phone_numbers = collect(json_decode($json));

        $phone_numbers->each(function ($phone_number) {
            Phone_number::create([
                "number" => $phone_number->number,
                "company_id" => $phone_number->company_id
            ]);
        });
    }
}






Below File is routes\web File
<?php

use App\Http\Controllers\CompanyController;
use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::resource("user", UserController::class);
Route::resource("company", CompanyController::class);





Comments

Popular posts from this blog

Eloquent Many to Many Relationship Tutorial in Laravel 11

Blade Template Tutorial Three Template Inheritance in Laravel 11