Day 10 #100DaysOfCode
Hôm này mình tiếp tục cuộc hành trình của #100DaysOfCode , các bạn biết đấy không gì là đơn giản cả, tôi cảm thấy mọi kiến thức ta học cần phải tìm hiểu từ từ mới hiểu được, đừng đi nhanh để cho xong một vấn đề hay tìm hiểu một ngôn ngữ mới. Mà phải tìm hiểu xem đó là gì? tại sao nó làm được như vậy? nó hay chổ nào? nên ta phải tìm hiểu nó, mới cảm nhận được.
Vì thế hôm này tôi phải đi nhẹ nhàng để tìm hiểu tiếp tục Laravel, hiện tại tôi đang tìm hiểu Laravel 5.8, rồi từ từ tôi sẽ tìm hiểu cao hơn nửa
Okay, Theo mình biết Laravel được xây dựng theo hướng MVC(Model - View - Controller), chắc mọi người cũng biết rằng Model sẽ thực hiện một chức năng chuẩn bị dữ liệu cho Controller, Khi Controller có yêu cầu gọi tới, View hiện thị dữ liệu cho người dùng xem
Okay chạy câu lệnh artisan tạo model thôi
php artisan make:model Product --migration php artisan make:model Comment --migration
Đoạn code trên mình bạn nhìn thấy có --migration phía sau, ở đây mình muốn nó với laravel rằng, tôi muốn tạo model Product, đồng thời tạo file migration trong App\database\migrations để tạo cở sở dữ liệu cho mô hình
Bạn cũng có thể dùng --migration hoặc -m. Ngoài ra Laravel rất hay đã cho ta tạo nhiều lớp model như
# Tạo một lớp factory trong đường dẫn App\database\factories , trong file class factory bạn có thể tạo dữ liệu mẫu cho Table
php artisan make:model Product --factory php artisan make:model Product -f
# Tạo model Product và class ProductSeeder trong App\database\seeds
php artisan make:model Product --seed php artisan make:model Product -s
# Tạo model đồng thời cũng tạo class ProductControlller trong App\Http\Controllers
php artisan make:model Product --controller php artisan make:model Product -c
# Tạo model và migration, factory, seeder, controller...
php artisan make:model Product -mfsc //or php artisan make:model Product -m -f -s -c
Nếu bạn muốn tạo riêng biệt theo ý muốn bạn có thể dùng cách sau đây
php artisan make:factory ProductsFactory php artisan make:seeder ProductsTableSeeder php artisan make:controller ProductController
Okay, về Facetory,Seeder mình sẽ tìm hiểu thêm về bài viết sau, để biết thêm về cách thực hiện nó cũng như tạo dữ liệu
Okay giờ mình đã có 2 model:
+ App\Product.php : tương ứng với table "Products" trong database
+ App\Comment.php : tương ứng với table "Comments" trong database
Để tạo hai table trên vào database, ta cần thiết lập như sau :
Mở .env chỉnh lại database, ở đây database của mình là "laravel58" ,user:"root",pass:"" rỗng
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel58 DB_USERNAME=root DB_PASSWORD=
Giờ chúng ta cần cấu hình table cho hai table "Products","Comments" như sau:
+ App\database\migrations\2021_01_06_014528_create_products_table.php
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateProductsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('products', function (Blueprint $table) { $table->bigIncrements('id'); $table->string("Title",200); $table->text("body"); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('products'); } }
+ App\database\migrations\2021_01_06_014906_create_comments_table.php
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCommentsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('comments', function (Blueprint $table) { $table->bigIncrements('id'); $table->text("content"); $table->unsignedBigInteger('product_id'); $table->foreign('product_id')->references('id')->on('products'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('comments'); } }
Okay, sao khi ta cấu hình các thuộc tính cho table xong, ta cần chạy lệnh migration để tạo table đến database "laravel58" của ta
php artisan migrate
Nếu không có lỗi gì xãy ra, bạn sẽ được database "laravel58" như hình dưới đây
Vậy là mình đã tạo model thành công rồi, giờ là lúc cấu hình replationship giữa model Product & Comment
+ App\Product.php : sẽ có nhiều sản phẩm , 1 sản phẩm có thể có nhiều comments
+ App\Comment.php : có rất nhiều comments, một comment chỉ thuộc một sản phẩm
Vì thế ta có thể cấu hình replationship như sau :
+ App\Product.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { public function comments() { return $this->hasMany('App\Comment'); } }
+ App\Comment.php
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Comment extends Model { public function product() { return $this->belongsTo(Product::class); } }
Vậy là mình đã replationship xong, để test chúng, ta cần tạo thử dữ liệu mẫu test xem sau
+ App\Http\Controllers\ProductController.php mình sẽ hiển thị product như sau
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Product; use App\Comment; class ProductController extends Controller { public function index(){ $products = Product::all()->toArray(); $comments = Comment::all()->toArray();; //relationship $data = Product::with("comments")->get()->toArray(); dd(["products"=>$products,"comments"=>$comments,"ProductComment"=>$data]); } }
+ routes/web.php
Route::get('/products','ProductController@index');
Bạn sẽ thấy như hình sau :
Thôi mình tìm hiểu nhiêu đây thôi, từ từ tìm hiểu thêm nửa kaka -> #100DaysOfCode