Database: Migrations
Author: | ADMIN |
---|
# Database Migrations
Migrations là một tính năng mạnh mẽ của Laravel giúp bạn quản lý cấu trúc cơ sở dữ liệu của ứng dụng một cách dễ dàng. Chúng cho phép bạn định nghĩa và thay đổi bảng trong cơ sở dữ liệu bằng mã PHP thay vì phải sử dụng SQL thuần.
Tạo Migration
Bạn có thể tạo một migration mới bằng cách sử dụng Artisan command make:migration
:
php artisan make:migration create_users_table
Lệnh này sẽ tạo một file migration trong thư mục database/migrations
. File migration có tên dựa trên timestamp hiện tại và mô tả mục đích của migration.
Cấu Trúc Migration
Một file migration điển hình gồm hai phương thức: up
và down
.
- up: Phương thức này dùng để định nghĩa các thay đổi bạn muốn thực hiện lên cơ sở dữ liệu (tạo bảng, thêm cột, thay đổi cột, ...).
- down: Phương thức này dùng để đảo ngược các thay đổi đã thực hiện trong phương thức
up
.
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('users');
}
}
Chạy Migration
Sau khi tạo migration, bạn có thể chạy nó bằng lệnh sau:
php artisan migrate
Lệnh này sẽ thực hiện tất cả các file migration chưa được chạy trước đó.
Rollback Migration
Nếu bạn muốn quay lại migration cuối cùng đã chạy, bạn có thể sử dụng lệnh:
php artisan migrate:rollback
Để rollback nhiều migration, bạn có thể thêm tùy chọn --step
:
php artisan migrate:rollback --step=3
Reset và Refresh Migration
-
Reset: Để rollback tất cả các migration:
php artisan migrate:reset
- Refresh: Để rollback tất cả các migration và sau đó chạy lại tất cả các migration từ đầu:
php artisan migrate:refresh
Thêm Cột vào Bảng
Nếu bạn muốn thêm cột vào một bảng hiện có, bạn cần tạo một migration mới:
php artisan make:migration add_profile_to_users_table --table=users
Trong file migration, bạn có thể thêm cột như sau:
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->string('profile')->nullable();
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('profile');
});
}
Xóa Bảng hoặc Cột
Để xóa bảng hoặc cột, bạn cũng tạo một migration mới và định nghĩa hành động trong phương thức up
và down
.
php artisan make:migration drop_users_table
Trong file migration, bạn có thể xóa bảng như sau:
public function up()
{
Schema::dropIfExists('users');
}
public function down()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
Tóm Tắt
Migrations là một phần quan trọng trong Laravel, giúp bạn quản lý cơ sở dữ liệu của ứng dụng một cách dễ dàng và hiệu quả. Chúng cho phép bạn định nghĩa các thay đổi đối với cấu trúc cơ sở dữ liệu bằng mã PHP, giúp việc theo dõi và quản lý các thay đổi trở nên dễ dàng hơn. Sử dụng migrations cũng giúp bạn duy trì tính nhất quán và khả năng sao lưu dữ liệu trong quá trình phát triển ứng dụng.
Database: Pagination
Author: | ADMIN |
---|
# Database: Pagination
Phân trang (pagination) là một kỹ thuật quan trọng để phân chia dữ liệu lớn thành các trang nhỏ hơn, giúp người dùng dễ dàng duyệt qua dữ liệu mà không phải tải toàn bộ dữ liệu cùng một lúc. Laravel cung cấp các phương pháp đơn giản để thực hiện phân trang với Eloquent và Query Builder.
1. Phân Trang Với Eloquent
Khi sử dụng Eloquent để truy vấn dữ liệu, bạn có thể sử dụng phương thức paginate
để phân trang kết quả. Ví dụ, giả sử bạn có một model Post
, bạn có thể phân trang các bài viết như sau:
// Lấy 10 bài viết mỗi trang
$posts = App\Models\Post::paginate(10);
// or
$users = DB::table('users')->paginate(10);
paginate($perPage)
: Phương thức này trả về một đối tượngLengthAwarePaginator
, chứa các bài viết cho trang hiện tại và thông tin phân trang.
Bạn có thể sử dụng biến $posts
trong view Blade để hiển thị dữ liệu và các liên kết phân trang:
@foreach ($posts as $post)
<div>{{ $post->title }}</div>
@endforeach
{{ $posts->links() }}
2. Phân Trang Tuỳ Chỉnh
Bạn có thể tùy chỉnh phân trang bằng cách thay đổi số lượng bản ghi trên mỗi trang hoặc thêm các tham số khác:
// Lấy 15 bản ghi mỗi trang và tùy chỉnh các tham số khác
$posts = App\Models\Post::paginate(15, ['*'], 'page', $currentPage);
$currentPage
: Bạn có thể chỉ định số trang hiện tại nếu cần thiết.
# Tùy Chỉnh URL Phân Trang
Laravel cho phép bạn tùy chỉnh URL phân trang để phù hợp với các yêu cầu hoặc cấu trúc URL của ứng dụng. Đây là các cách bạn có thể thực hiện việc này:
1. Tùy Chỉnh Tham Số URL
Bạn có thể tùy chỉnh các tham số của URL phân trang bằng cách sử dụng phương thức appends
để thêm các tham số bổ sung vào các liên kết phân trang. Ví dụ, nếu bạn muốn giữ lại các tham số truy vấn hiện tại trong URL phân trang:
$posts = App\Models\Post::paginate(10)->appends(['sort' => 'desc']);
appends($array)
: Thêm các tham số bổ sung vào URL phân trang.
Ví dụ trong view Blade:
@foreach ($posts as $post)
<div>{{ $post->title }}</div>
@endforeach
{{ $posts->appends(['sort' => 'desc'])->links() }}
2. Tùy Chỉnh Đường Dẫn Phân Trang
$users->withPath('/admin/users');
withPath('/admin/users')
: Phương thức này được sử dụng để tùy chỉnh đường dẫn phân trang. Thay vì sử dụng đường dẫn mặc định, bạn có thể chỉ định một đường dẫn khác cho các liên kết phân trang.
# Các Phương Thức Của Paginator
/ LengthAwarePaginator
Khi làm việc với phân trang trong Laravel, bạn sẽ thường xuyên sử dụng các phương thức của lớp Paginator
hoặc LengthAwarePaginator
. Dưới đây là các phương thức chính và cách sử dụng chúng:
$users = User::paginate(15);
// Số mục trên trang hiện tại
$count = $users->count();
// Số trang hiện tại
$currentPage = $users->currentPage();
// Số thứ tự của mục đầu tiên
$firstItem = $users->firstItem();
// Các tùy chọn phân trang
$options = $users->getOptions();
// Dãy URL từ trang 1 đến trang 5
$urls = $users->getUrlRange(1, 5);
// Kiểm tra có nhiều trang không
$hasPages = $users->hasPages();
// Kiểm tra có còn trang kế tiếp không
$hasMore = $users->hasMorePages();
// Các mục trên trang hiện tại
$items = $users->items();
// Số thứ tự của mục cuối cùng
$lastItem = $users->lastItem();
// Số trang cuối cùng
$lastPage = $users->lastPage();
// URL của trang kế tiếp
$nextPageUrl = $users->nextPageUrl();
// Kiểm tra có đang ở trang đầu tiên không
$onFirstPage = $users->onFirstPage();
// Số lượng mục trên mỗi trang
$perPage = $users->perPage();
// URL của trang trước đó
$previousPageUrl = $users->previousPageUrl();
// Tổng số mục
$total = $users->total();
// URL của trang số 2
$url = $users->url(2);
// Biến truy vấn để lưu trữ số trang
$pageName = $users->getPageName();
// Đặt tên biến truy vấn để lưu trữ số trang
$users->setPageName('page');
// Chuyển đổi từng mục để chỉ lấy tên người dùng return $user->name;
$transformedUsers = $users->through(function ($user) {
return $user->name;
});
# Các Phương Thức Của CursorPaginator
Method | Description |
$paginator->count()
|
Số mục trên trang hiện tại
|
$paginator->cursor()
|
Đối tượng con trỏ hiện tại
|
$paginator->getOptions()
|
Các tùy chọn phân trang
|
$paginator->hasPages()
|
Kiểm tra có nhiều trang không
|
$paginator->hasMorePages()
|
Kiểm tra có còn mục nào không
|
$paginator->getCursorName()
|
Biến truy vấn để lưu trữ con trỏ
|
$paginator->items()
|
Các mục trên trang hiện tại
|
$paginator->nextCursor()
|
Con trỏ cho tập hợp mục tiếp theo
|
$paginator->nextPageUrl()
|
URL của trang kế tiếp
|
$paginator->onFirstPage()
|
Kiểm tra có đang ở trang đầu tiên không
|
$paginator->onLastPage()
|
Kiểm tra có đang ở trang cuối cùng không
|
$paginator->perPage()
|
Số lượng mục trên mỗi trang
|
$paginator->previousCursor()
|
Con trỏ cho tập hợp mục trước đó
|
$paginator->previousPageUrl()
|
URL của trang trước đó
|
$paginator->setCursorName()
|
Đặt tên biến truy vấn để lưu trữ con trỏ
|
$paginator->url($cursor)
|
URL cho con trỏ cụ thể
|
Database: Seeding
Author: | ADMIN |
---|
Seeding trong Laravel là một cách để tự động thêm dữ liệu mẫu vào cơ sở dữ liệu của bạn. Điều này hữu ích khi bạn cần tạo ra dữ liệu thử nghiệm hoặc khởi tạo dữ liệu mặc định cho ứng dụng.
Tạo Seeder
Bạn có thể tạo một seeder mới bằng cách sử dụng lệnh Artisan:
php artisan make:seeder UsersTableSeeder
Lệnh này sẽ tạo một file seeder mới trong thư mục database/seeders
.
Định Nghĩa Seeder
Khi bạn mở file seeder, nó sẽ trông giống như sau:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class UsersTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// Đoạn mã để chèn dữ liệu mẫu vào bảng users
}
}
Bạn có thể sử dụng phương thức DB::table
hoặc các phương thức của Eloquent để chèn dữ liệu vào bảng:
public function run()
{
DB::table('users')->insert([
'name' => Str::random(10),
'email' => Str::random(10).'@gmail.com',
'password' => bcrypt('password'),
]);
}
Hoặc sử dụng model Eloquent:
public function run()
{
\App\Models\User::create([
'name' => 'John Doe',
'email' => 'johndoe@example.com',
'password' => bcrypt('password'),
]);
}
Gọi Seeder
Sau khi định nghĩa seeder, bạn cần gọi nó trong lớp DatabaseSeeder
để nó được chạy khi bạn chạy lệnh seed:
// database/seeders/DatabaseSeeder.php
public function run()
{
$this->call(UsersTableSeeder::class);
}
Chạy Seeder
Bạn có thể chạy tất cả các seeder bằng lệnh Artisan:
php artisan db:seed
Hoặc chạy một seeder cụ thể:
php artisan db:seed --class=UsersTableSeeder
Tái Tạo Cơ Sở Dữ Liệu
Nếu bạn muốn làm mới cơ sở dữ liệu và chạy lại các seeder, bạn có thể sử dụng lệnh migrate:fresh
:
php artisan migrate:fresh --seed
Lệnh này sẽ xóa tất cả các bảng trong cơ sở dữ liệu của bạn và chạy lại tất cả các migration và seeder.
Tùy chọn --seeder có thể được sử dụng để chỉ định một seeder cụ thể để chạy:
php artisan migrate:fresh --seed --seeder=UserSeeder
Sử Dụng Factory trong Seeder
Laravel có thể tích hợp factory với seeder để tạo ra dữ liệu mẫu phong phú hơn. Ví dụ, bạn có thể sử dụng factory để tạo nhiều người dùng một cách dễ dàng:
public function run()
{
\App\Models\User::factory(10)->create();
}
Forcing Seeders to Run in Production
Khi làm việc với Laravel, bạn có thể muốn chạy seeder (tạo dữ liệu mẫu) ngay cả khi ứng dụng đang ở môi trường production. Điều này thường bị ngăn chặn để tránh nguy cơ làm hỏng dữ liệu thực tế. Tuy nhiên, đôi khi bạn vẫn cần phải chạy seeder trong môi trường production, và Laravel cung cấp cách để làm điều này một cách an toàn.
php artisan db:seed --force
Cờ --force
sẽ bỏ qua cảnh báo và cho phép seeder chạy ngay cả khi ứng dụng đang ở môi trường production.
Ví dụ Thực Tế
Giả sử bạn có một seeder gọi là DatabaseSeeder
và bạn muốn chạy nó trong môi trường production. Bạn chỉ cần chạy lệnh sau từ dòng lệnh:
php artisan db:seed --class=DatabaseSeeder --force
Lệnh trên sẽ thực hiện seeding dữ liệu từ DatabaseSeeder
vào cơ sở dữ liệu hiện tại, ngay cả khi ứng dụng đang ở môi trường production.
Chạy Seeder Cụ Thể
Nếu bạn chỉ muốn chạy một seeder cụ thể trong môi trường production, bạn có thể chỉ định seeder đó với cờ --class
cùng với --force
. Ví dụ:
php artisan db:seed --class=UsersTableSeeder --force
Điều này sẽ chỉ chạy seeder UsersTableSeeder
.
Sử Dụng Migrate với Seeder
Nếu bạn muốn chạy migration kèm theo seeder trong môi trường production, bạn có thể sử dụng lệnh migrate:fresh
hoặc migrate
cùng với cờ --seed
và --force
:
php artisan migrate:fresh --seed --force
// or
php artisan migrate --seed --force
Cả hai lệnh trên sẽ chạy migration để tạo lại hoặc cập nhật các bảng trong cơ sở dữ liệu và sau đó chạy seeder.