
Ở bài trước, chúng ta đã nắm sơ bộ về Eloquent Factories rồi, tiếp theo, chúng ta cùng tìm hiểu tiếp các Relationships trong Factories nhé.
# Many to Many Relationships
Laravel cung cấp nhiều cách để xây dựng và quản lý các mối quan hệ giữa các mô hình bằng cách sử dụng factories. Dưới đây là hướng dẫn chi tiết về các loại mối quan hệ khác nhau và cách sử dụng factories để tạo chúng.
1. Quan Hệ Many-to-Many
Khi hai mô hình có mối quan hệ nhiều-mối quan hệ, bạn có thể sử dụng phương thức hasAttached
của factory để liên kết chúng qua bảng pivot.
Tạo Mô Hình Với Mối Quan Hệ Many-to-Many
Giả sử bạn có mô hình User
và Role
, và bạn muốn tạo một người dùng với ba vai trò:
use App\Models\Role;
use App\Models\User;
$user = User::factory()
->hasAttached(
Role::factory()->count(3),
['active' => true] // Thuộc tính trên bảng pivot
)
->create();
Sử Dụng Closure Để Thay Đổi Trạng Thái
Nếu trạng thái cần truy cập mô hình liên quan, bạn có thể sử dụng closure:
$user = User::factory()
->hasAttached(
Role::factory()
->count(3)
->state(function (array $attributes, User $user) {
return ['name' => $user->name.' Role'];
}),
['active' => true]
)
->create();
Sử Dụng Các Mô Hình Hiện Có
Nếu bạn đã có các mô hình để liên kết, bạn có thể truyền chúng vào phương thức hasAttached
:
$roles = Role::factory()->count(3)->create();
$user = User::factory()
->count(3)
->hasAttached($roles, ['active' => true])
->create();
Sử Dụng Các Phương Thức "Magic"
Để tiện lợi, bạn có thể sử dụng phương thức "ma thuật" để tạo quan hệ nhiều-mối quan hệ:
$user = User::factory()
->hasRoles(1, [
'name' => 'Editor'
])
->create();
# Quan Hệ "Đa Hình" (Polymorphic Relationships)
Các quan hệ đa hình có thể được tạo bằng factories như các quan hệ bình thường.
Quan Hệ Morph Many
Nếu mô hình Post
có mối quan hệ morphMany
với mô hình Comment
:
use App\Models\Post;
$post = Post::factory()->hasComments(3)->create();
Morph To Relationships
Để tạo các quan hệ morphTo
, bạn không thể sử dụng các phương thức "ma thuật". Thay vào đó, bạn sử dụng phương thức for
:
$comments = Comment::factory()->count(3)->for(
Post::factory(), 'commentable'
)->create();
Quan Hệ "Many-to-Many" Đa Hình
Quan hệ nhiều-mối quan hệ đa hình có thể được tạo giống như các quan hệ nhiều-mối quan hệ không phải đa hình:
use App\Models\Tag;
use App\Models\Video;
$videos = Video::factory()
->hasAttached(
Tag::factory()->count(3),
['public' => true]
)
->create();
Bạn cũng có thể sử dụng phương thức "ma thuật":
$videos = Video::factory()
->hasTags(3, ['public' => true])
->create();
Định Nghĩa Quan Hệ Trong Factory
Để định nghĩa một mối quan hệ trong factory của mô hình, bạn thường gán một instance factory mới cho khóa ngoại của mối quan hệ.
Định Nghĩa Quan Hệ "Belongs To"
Ví dụ, nếu bạn muốn tạo một người dùng mới khi tạo một bài viết, bạn có thể làm như sau:
use App\Models\User;
/**
* Định nghĩa trạng thái mặc định của mô hình.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'user_id' => User::factory(),
'title' => fake()->title(),
'content' => fake()->paragraph(),
];
}
Sử Dụng Closure Để Định Nghĩa Trạng Thái
Nếu các cột của mối quan hệ phụ thuộc vào factory định nghĩa nó, bạn có thể gán một closure cho thuộc tính:
public function definition(): array
{
return [
'user_id' => User::factory(),
'user_type' => function (array $attributes) {
return User::find($attributes['user_id'])->type;
},
'title' => fake()->title(),
'content' => fake()->paragraph(),
];
}
Tái Sử Dụng Một Mô Hình Đã Tạo
Nếu bạn có các mô hình chia sẻ một mối quan hệ chung với một mô hình khác, bạn có thể sử dụng phương thức recycle
để đảm bảo một instance của mô hình liên quan được tái sử dụng cho tất cả các mối quan hệ được tạo bởi factory.
Tái Sử Dụng Một Mô Hình Để Liên Kết
Ví dụ, nếu bạn có các mô hình Airline
, Flight
, và Ticket
, và bạn muốn đảm bảo rằng cùng một hãng hàng không được sử dụng cho cả vé và chuyến bay, bạn có thể làm như sau:
Ticket::factory()
->recycle(Airline::factory()->create())
->create();
Tái Sử Dụng Một Bộ Sưu Tập Mô Hình
Bạn cũng có thể truyền một bộ sưu tập mô hình vào phương thức recycle
. Khi có bộ sưu tập, một mô hình ngẫu nhiên từ bộ sưu tập sẽ được chọn khi factory cần một mô hình loại đó:
$airlines = Airline::factory()->count(3)->create();
Ticket::factory()
->recycle($airlines)
->create();
Danh mục
Bài viết liên quan

Quản Lý Thời Gian Tự Động Trong Eloquent
Author: | ADMIN |
---|

Các Mối Quan Hệ Trong Eloquent
Author: | ADMIN |
---|

Basic Eloquent Model and MVC
Author: | ADMIN |
---|

Eager Loading
Author: | ADMIN |
---|
Bài viết khác

Blade Basics
Author: | ADMIN |
---|

9 Mẹo Hữu Ích Khi Sử Dụng Blade Trong Laravel
Author: | ADMIN |
---|

Hiển thị giá trị trong Blade
Author: | ADMIN |
---|