Trong bài viết này, chúng ta sẽ thấy mối quan hệ many to many trong ví dụ về laravel 9. Mối quan hệ nhiều-nhiều phức tạp hơn mối quan hệ một-một và một-nhiều. Một ví dụ về mối quan hệ giống như một người dùng có nhiều vai trò, trong đó vai trò cũng được kết nối với nhiều người dùng. Ngoài ra, bạn có thể sử dụng nhiều mối quan hệ trong laravel 6 và laravel 7 và laravel 8
Vì vậy, chúng ta hãy xem mối quan hệ nhiều với nhiều của laravel 9, ví dụ về laravel 9 hasMany, mối quan hệ eloquent của laravel 9 và mối quan hệ của laravel 9
Chúng tôi sẽ tạo một bảng Người dùng và Vai trò và Role_users. tất cả các bảng được kết nối với nhau bảng. Bây giờ chúng ta sẽ tạo nhiều mối quan hệ với nhau bằng cách sử dụng Eloquent Model của laravel
Ngoài ra, chúng tôi sẽ tạo di chuyển bằng khóa ngoại, đồng bộ hóa với bảng tổng hợp, truy xuất bản ghi bằng mô hình, chèn bản ghi mới, cập nhật bản ghi, v.v.
Bây giờ, chúng ta phải tạo di chuyển cho người dùng và bảng vai trò và vai trò_người dùng. chúng tôi cũng sẽ thêm các khóa ngoại vào bảng người dùng và vai trò
Tạo bảng di chuyển người dùng
Schema::create['users', function [Blueprint $table] {
$table->increments['id'];
$table->string['name'];
$table->string['email']->unique[];
$table->timestamps[];
}];
Tạo di chuyển của Bảng vai trò
Schema::create['roles', function [Blueprint $table] {
$table->increments['id'];
$table->string['name'];
$table->timestamps[];
}];
Tạo di chuyển của Bảng người dùng vai trò
Schema::create['role_users', function [Blueprint $table] {
$table->integer['user_id']->unsigned[];
$table->integer['role_id']->unsigned[];
$table->foreign['user_id']->references['id']->on['users']->onDelete['cascade'];
$table->foreign['role_id']->references['id']->on['roles']->onDelete['cascade'];
}];
Tạo mô hình và thêm mối quan hệ trên cả hai mô hình
Bây giờ, chúng ta sẽ tạo Người dùng, Mô hình vai trò. chúng tôi sẽ sử dụng mối quan hệ thuộc vềToMany[] cho cả hai mô hình
Mô hình người dùng
belongsToMany[Role::class, 'role_users'];
}
}
Người mẫu
belongsToMany[User::class, 'role_users'];
}
}
Truy xuất bản ghi bằng Model
Khi mối quan hệ được xác định, chúng tôi có thể truy xuất bản ghi liên quan bằng các thuộc tính động của Eloquent
Trước khi tiếp tục, tôi cho rằng bạn nên biết Mối quan hệ một đối một và Một đối nhiều hoạt động như thế nào trong Laravel
Vì vậy, hãy đi sâu vào nhiều mối quan hệ của Laravel Eloquent
Mối quan hệ nhiều đến nhiều là gì?
Mối quan hệ Nhiều Đến Nhiều liên kết một bản ghi trong bảng với một hoặc nhiều bản ghi trong một bảng khác và ngược lại. Không giống như Một đến Nhiều và Một đến Một, trong loại mối quan hệ này, chìa khóa là phép nối [bảng tổng hợp] mà bạn xác định giữa hai bảng để liên kết chúng. Bảng tổng hợp cho phép mối quan hệ
php artisan make:model Category -m php artisan make:model Product -m6 từ một mô hình có liên quan đến nhiều mô hình khác và ngược lại
Một ví dụ thực tế chúng ta có thể nghĩ đến là các sản phẩm và danh mục. Một danh mục có thể có nhiều sản phẩm và một sản phẩm có thể liên quan đến nhiều danh mục, đơn giản không phải. Để hiểu rõ hơn về cách chúng ta có thể sử dụng mối quan hệ này, hãy thực hiện một số mã hóa
Cài đặt Laravel trước 😃
Để bắt đầu, chúng ta sẽ tạo một ứng dụng Laravel mới. Chạy lệnh bên dưới trong thiết bị đầu cuối của bạn để tạo một ứng dụng mới
composer create-project laravel/laravel ManyToMany --prefer-dist
Khi bạn có bản cài đặt mới của Laravel, hãy tiếp tục thiết lập thông tin đăng nhập cơ sở dữ liệu của bạn trong tệp
php artisan make:model Category -m php artisan make:model Product -m7
Tạo mô hình và di chuyển
Đầu tiên, chúng tôi sẽ tạo hai mô hình được gọi là Sản phẩm và Danh mục cùng với quá trình di chuyển của chúng. Chạy lệnh bên dưới để tạo mô hình và di chuyển
php artisan make:model Category -m php artisan make:model Product -m
Sau khi bạn có các mô hình và quá trình di chuyển được tạo, hãy cập nhật chúng bằng mã bên dưới
Danh mục di chuyển
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }
Hạng mục Người mẫu
// Category.php namespace App; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; protected $fillable = ['name', 'description']; }
Di chuyển sản phẩm
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['name']; $table->float['price']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['products']; } }
dòng sản phẩm
namespace App; use Illuminate\Database\Eloquent\Model; class Product extends Model { protected $table = 'products'; protected $fillable = ['name', 'price', 'description']; }
Bây giờ hãy vào terminal của bạn và chạy lệnh bên dưới để di chuyển cả hai bảng vào cơ sở dữ liệu
php artisan migrate
ngày giả
Vì lợi ích của hướng dẫn này, hãy thêm một số danh mục và sản phẩm giả vào cơ sở dữ liệu của bạn
Tạo bảng Pivot
Bây giờ, chúng ta cần kết nối hai bảng này bằng bảng liên kết có tên là Pivot Table. Bảng tổng hợp là một bảng quan hệ sẽ chứa
php artisan make:model Category -m php artisan make:model Product -m8 và
php artisan make:model Category -m php artisan make:model Product -m9 trong đó
Bạn có thể lưu trữ nhiều thông tin hơn trong bảng tổng hợp, nhưng hiện tại chúng ta chỉ cần tạo mối quan hệ nhiều đến nhiều. Tôi sẽ đề cập đến việc sử dụng bảng tổng hợp để lưu trữ dữ liệu bổ sung trong một bài viết riêng
Chạy lệnh bên dưới để tạo di chuyển cho bảng tổng hợp của chúng tôi
php artisan make:migration create_category_product_table
Khi bạn đã di chuyển cho bảng
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }0, hãy cập nhật quá trình di chuyển bằng mã bên dưới
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoryProductTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['category_product', function [Blueprint $table] { $table->engine = 'MyISAM'; $table->bigIncrements['id']; $table->integer['category_id']->unsigned[]; $table->integer['product_id']->unsigned[]; $table->foreign['category_id']->references['id']->on['categories']; $table->foreign['product_id']->references['id']->on['products']; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['category_product']; } }
Trong phần di chuyển ở trên, chúng tôi đang thêm ba cột trong bảng này,
php artisan make:model Category -m php artisan make:model Product -m6,
php artisan make:model Category -m php artisan make:model Product -m8 và
php artisan make:model Category -m php artisan make:model Product -m9. Hãy chú ý đến quá trình di chuyển, chúng tôi cũng đang đặt các khóa ngoại trên các bảng tương ứng của chúng
Bây giờ, hãy chạy lệnh artisan để di chuyển bảng này vào cơ sở dữ liệu
php artisan migrate
Xác định mối quan hệ Many To Many trong Laravel Eloquent
Cuối cùng, đã đến lúc xác định mối quan hệ Many to Many giữa Category và Product model bằng cách sử dụng Laravel Eloquent
Đầu tiên, chúng tôi biết nhiều danh mục thuộc về nhiều sản phẩm, vì vậy chúng tôi có thể thêm mối quan hệ thuộc về nhiều trong mô hình Sản phẩm. Mở lớp mô hình Sản phẩm và thêm một phương thức mới gọi là
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }4 như bên dưới
php artisan make:model Category -m php artisan make:model Product -m0
Tương tự, chúng tôi biết nhiều sản phẩm thuộc nhiều danh mục, vì vậy chúng tôi có thể xác định mối quan hệ thuộc vềToMany trên mô hình Danh mục như bên dưới. Thêm một phương thức mới trong mô hình Danh mục có tên là
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }5 như bên dưới
php artisan make:model Category -m php artisan make:model Product -m1
Tạo mối quan hệ Many To Many
Bây giờ, hãy tạo một số danh mục và sản phẩm, đồng thời tạo mối quan hệ Nhiều đến Nhiều giữa chúng. Đầu tiên chúng ta sẽ tạo một số danh mục như bên dưới [Việc bạn thêm sản phẩm và danh mục như thế nào là hoàn toàn do bạn quyết định]
php artisan make:model Category -m php artisan make:model Product -m2
Bây giờ bạn sẽ có một số danh mục như bên dưới trong bảng danh mục của mình
Bây giờ chúng ta sẽ tạo một sản phẩm và gắn chúng vào một vài danh mục
php artisan make:model Category -m php artisan make:model Product -m3
Đoạn mã trên sẽ tạo một sản phẩm rồi gắn sản phẩm đó vào nhiều danh mục
Trong bảng
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }0, bạn có thể thấy
php artisan make:model Category -m php artisan make:model Product -m9 1 có nhiều mục nhập với
php artisan make:model Category -m php artisan make:model Product -m8 2 và 3
Đó là cách bạn có thể tạo nhiều mối quan hệ trong Laravel Eloquent. Rõ ràng, bạn có thể sử dụng nghịch đảo của mối quan hệ này để đính kèm một danh mục cho nhiều sản phẩm
Truy xuất nhiều đến nhiều dữ liệu quan hệ
Khi bạn đã thiết lập mối quan hệ và tạo một số bản ghi, bạn có thể bắt đầu sử dụng các bản ghi liên quan cho một mô hình cụ thể. Trong ví dụ của chúng ta, chúng ta có thể sử dụng phương pháp
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }9 để lấy các danh mục liên quan cho một sản phẩm và tương tự, chúng ta có thể sử dụng
// Category.php namespace App; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; protected $fillable = ['name', 'description']; }0 để lấy tất cả các sản phẩm cho một danh mục nhất định
php artisan make:model Category -m php artisan make:model Product -m4
Vì mối quan hệ nhiều-nhiều luôn trả về tập hợp, bạn có thể chạy vòng lặp trên đó để hiển thị bản ghi của mình
Xóa một mối quan hệ nhiều thành nhiều
Cách chúng ta đã sử dụng phương pháp
// Category.php namespace App; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; protected $fillable = ['name', 'description']; }1 để gắn nhiều mô hình vào nhiều mô hình, chúng ta có thể sử dụng
// Category.php namespace App; use Illuminate\Database\Eloquent\Model; class Category extends Model { protected $table = 'categories'; protected $fillable = ['name', 'description']; }2 để loại bỏ mối quan hệ nhiều với nhiều giữa các mô hình
php artisan make:model Category -m php artisan make:model Product -m5
Bây giờ hãy đi tới bảng
use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateCategoriesTable extends Migration { /** * Run the migrations. * * @return void */ public function up[] { Schema::create['categories', function [Blueprint $table] { $table->bigIncrements['id']; $table->string['name']; $table->text['description']->nullable[]; $table->timestamps[]; }]; } /** * Reverse the migrations. * * @return void */ public function down[] { Schema::dropIfExists['categories']; } }0 của bạn và bạn sẽ thấy rằng bản ghi
php artisan make:model Category -m php artisan make:model Product -m8 2 đã bị xóa khỏi bảng
Phần kết luận
Trong hướng dẫn này, chúng ta đã xem xét cách sử dụng mối quan hệ Many to Many trong Laravel Eloquent. Tôi sẽ khuyên bạn nên dành thời gian tốt để đọc
Nếu bạn có bất kỳ câu hỏi nào về bài đăng này, hãy để lại trong hộp bình luận bên dưới và chúng tôi sẽ trả lời ngay lập tức