Relasi kepemilikan dalam Laravel

Dalam laravel, yang namanya relasi itu sangat mudah sekali. Jadi untuk tutorial ini saya akan menggunakan laravel.

Kali ini kita akan belajar tentang Relation of Ownership (Relasi kepemilikan) yang pastinya itu akan berhubungan dengan One to Many Relationship. Sebagai contoh kita akan membuat 2 table yaitu posts dan replies.

Silahkan buat model dan migration sekaligus dengan command line anda seperti.

php artisan make:model Post -m
php artisan make:model Reply -m

Setelah itu, buka kedua file migrasinya. (2017_12_23_184118_create_posts_table.php, 2017_12_23_184133_create_replies_table.php). Untuk posts table kita hanya butuh 1 field yaitu title.

Schema::create('posts', function (Blueprint $table) {
    $table->increments('id');
    $table->string('title');
    $table->timestamps();
});

Kemudian untuk table replies kita butuh 2 field.

Schema::create('replies', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('post_id');
    $table->text('body');
    $table->timestamps();
});

Mungkin jika anda lihat, ini adalah table yang paling sedikit fieldnya sedunia, betul sekali, karna ini hanyalah contoh untuk tutorial ini. Yang penting nantinya anda mengerti apa yang saya maksud.

Untuk table posts, saya akan mengisi data sebanyak 6 seperti dibawah

 id | title                                               |
+----+---------------------------------------------------- +
|  1 | Error eligendi velit cumque.                        |
|  2 | Sunt rerum quibusdam est dolore numquam nobis et.   |
|  3 | Dolores labore optio sunt debitis.                  |
|  4 | Nulla nobis labore repellendus.                     |
|  5 | Temporibus molestias ipsa impedit velit voluptates. |
|  6 | Quis temporibus placeat nihil non et rerum.         |

Dan untuk table replies saya akan random seperti.

+----+---------+---------------------------------------------------------------------------+
| id | post_id | body                                                                      |
+----+---------+---------------------------------------------------------------------------+
|  1 |       3 | Sapiente porro id velit eveniet nesciunt quibusdam necessitatibus.        |
|  2 |       3 | Alias consequuntur officia quis beatae.                                   |
|  3 |       1 | Omnis et labore inventore quasi ab reiciendis eum.                        |
| 4  |       2 | Sed impedit nihil expedita iure.                                          |
| 5  |       2 | Voluptas magnam vitae vitae sit eligendi.                                 |
| 6  |       4 | Eveniet pariatur fugiat porro.                                            |
| 7  |       4 | Quas provident praesentium praesentium corporis explicabo qui.            |

Jika anda lihat, hanya post 5 dan 6 yang tidak mempunyai balasan(reply). Disini kita akan belajar bagaimana menampilkan post yang mempunyai balasan, dan post yang tidak mempunyai balasan, plus saya juga akan mengajari anda tentaang with count.

Kita sudah tau bahwa setiap post pastinya mempunyai banyak balasan, maka dari itu akan menggunakan one to many relationship disini. Silahkan buka file model Post.php dan tambahkan method replies seperti dibawah.

public function replies()
{
    return $this->hasMany(Reply::class);
}

Jika sudah, silahkan buka file web.php (routes/web.php). Disini kita tidak akan menyentuh controller. Kita akan kerja dalam route saja.

Kita sudah tahu, jika ingin menampilkan semua posts adalah dengan menggunakan method all seperti.

Route::get('/', function () {
    $posts = Post::all();
    dd($posts);
});

Pertanyaanya, bagaimana kita menampilkan post yang hanya mempunyai balasan. Itu sangat mudah sekali om.

$posts = Post::whereHas('replies')->get();

Maka itu akan menampilkan post yang mempunyai balasan saja, tetapi bagaimana dengan sebaliknya. Bagaimana cara kita menampilkan post yang tidak mempunyai balasan. Itu juga sangat mudah sekali.

$posts = Post::doesntHave('replies')->get();

Simple kan. Laravel memang ok jika kita bicara relasi.

Selanjutnya, kita akan belajar bagaimana cara menghitung balasan pada setiap post. Itu juga sangat mudah sekali om.

$posts = Post::withCount('replies')->whereHas('replies')->get();
foreach ($posts as $p) {
    echo "$p->replies_count <br>";
}

Atau jika ingin otomatis, artinya tidak perlu menambahkan withCount method setiap ingin fetching data. Kita bisa membuatnya di model tersebut, buka kembali Post.php file dan tambah kan identifiernya seperti.

protected $withCount = ['replies'];

Selanjutnya kita bisa dengan mudah membuat rule yang kita inginkan tampa harus membuat method withCount.

$posts = Post::whereHas('replies')->get();
dd($posts);

Maka hasilnya akan sama dengan Post::withCount('replies')->whereHas('replies')->get().

Ok, siap sudah tutorial ini, jika anda merasa tutorial ini bermanfaat silahkan share ya om. Saya Irsyad. See you :)



Generic placeholder image
By Irsyad A. Panjaitan
I am error

Comments

Please login to leave a comment!