Eloquent Relationships

Author: Al-mamun Sarkar Date: 2020-07-02 09:19:15

এই লেসনে আমরা দেখবো লারাভেল এ কিভাবে Eloquent Relationships ব্যবহার করতে হয়।Eloquent Relationships ব্যবহার করে কিভাবে One-to-One, One-to-Many, Many-to-Many নিয়ে কাজ করতে হয়। 

 

Database ERD

 

Source Code:

 

CreatePostsTable:

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

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->foreignId('user_id');
            $table->text('description');
            $table->boolean('status');
            $table->timestamps();
        });
    }

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

CreateAddressTable:

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

class CreateAddressTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('address', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id');
            $table->string('state')->nullable();
            $table->string('city')->nullable();
            $table->string('country')->nullable();
            $table->timestamps();
        });
    }

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

CreateTagsTable:

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

class CreateTagsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->timestamps();
        });
    }

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

CreatePostTagTable:


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

class CreatePostTagTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('post_tag', function (Blueprint $table) {
            $table->foreignId('post_id');
            $table->foreignId('tag_id');
        });
    }

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

 

Routes:

use Illuminate\Support\Facades\Route;
use App\Post;
use App\User;
use App\Address;
use App\Tag;


Route::get('one-to-one', function() {
	$user = User::find(2);
	echo $user->name . '<br/>';
	echo $user->email . '<br/>';
	echo $user->address->country . '<br/>';
});


Route::get('one-to-one-inverse', function() {
	$address = Address::find(2);
	echo $address->city . '<br/>';
	echo $address->user->name . '<br/>';

	dd($address->user);
});


Route::get('one-to-many', function() {
	$user = User::find(1);
	echo $user->name . '<br/>';
	
	foreach ($user->posts as $post) {
		echo $post->title . '<br/>';
	}
});

Route::get('one-to-many-inverse', function() {
	$post = Post::find(17);
	echo $post->title . '<br/>';
	echo $post->user->name . '<br/>';
	
	// $post->user->name  = 'Mamun Sarkar';
	// $post->user->save();

	dd($post->user);
});


Route::get('many-to-many', function() {
	$post = Post::find(2);
	echo $post->title . '<br/>';

	echo '<h2> Tags </h2>';
	foreach ($post->tags as $tag) {
		echo $tag->title . '<br/>';
	}

	// dd($post->tags);
});


Route::get('many-to-many-inverse', function() {
	$tag = Tag::find(1);
	echo $tag->title . '<br/>';

	echo '<h2> Posts </h2>';
	foreach ($tag->posts as $post) {
		echo $post->title . '<br/>';
	}
	// dd($tag->posts);
});

Route::get('attach', function() {
	$post = Post::find(1);
	$post->tags()->attach([1, 2]);
});

Route::get('sync', function() {
	$post = Post::find(1);
	$post->tags()->sync([1, 2]);
});

Route::get('detach', function() {
	$post = Post::find(1);
	$post->tags()->detach();
});