update code training base

parent 11c931f2
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Country extends Model
{
use HasFactory;
protected $fillable = [
'name',
];
// Relation ke User
public function users()
{
return $this->hasMany(User::class);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Course extends Model
{
use HasFactory;
protected $fillable = [
'title',
'description',
];
// Course boleh ada ramai Student
public function students()
{
return $this->belongsToMany(Student::class)->withTimestamps();
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'title',
'content',
];
// Relation ke User
public function user()
{
return $this->belongsTo(User::class);
}
}
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Student extends Model
{
use HasFactory;
protected $fillable = [
'name',
'email',
'phone',
];
// Student boleh join banyak Course
public function courses()
{
return $this->belongsToMany(Course::class)->withTimestamps();
}
}
......@@ -40,4 +40,9 @@ class User extends BaseUser
protected $casts = [
'email_verified_at' => 'datetime',
];
public function country()
{
return $this->belongsTo(Country::class);
}
}
<?php
namespace Database\Factories;
use App\Models\Course;
use Illuminate\Database\Eloquent\Factories\Factory;
class CourseFactory extends Factory
{
protected $model = Course::class;
public function definition(): array
{
return [
'title' => $this->faker->sentence(3),
'description' => $this->faker->paragraph(),
];
}
}
<?php
namespace Database\Factories;
use App\Models\Post;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
protected $model = Post::class;
public function definition(): array
{
return [
'title' => $this->faker->sentence(),
'content' => $this->faker->paragraph(),
];
}
}
<?php
namespace Database\Factories;
use App\Models\Student;
use Illuminate\Database\Eloquent\Factories\Factory;
class StudentFactory extends Factory
{
protected $model = Student::class;
public function definition(): array
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'phone' => $this->faker->phoneNumber(),
];
}
}
......@@ -6,26 +6,27 @@
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('sessions', function (Blueprint $table) {
$table->string('id')->primary();
$table->foreignId('user_id')->nullable()->index();
$table->string('ip_address', 45)->nullable();
$table->text('user_agent')->nullable();
$table->longText('payload');
$table->integer('last_activity')->index();
Schema::table('users', function (Blueprint $table) {
if (!Schema::hasColumn('users', 'status')) {
$table->enum('status', ['active', 'inactive'])->default('active')->after('password');
}
if (!Schema::hasColumn('users', 'role')) {
$table->string('role')->default('staff')->after('status');
}
if (!Schema::hasColumn('users', 'last_login_at')) {
$table->timestamp('last_login_at')->nullable()->after('role');
}
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('sessions');
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['status', 'role', 'last_login_at']);
});
}
};
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// 1️⃣ Countries
Schema::create('countries', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
// 2️⃣ Alter users table → add country_id
Schema::table('users', function (Blueprint $table) {
if (!Schema::hasColumn('users', 'country_id')) {
$table->foreignId('country_id')
->nullable()
->constrained('countries')
->cascadeOnDelete();
}
});
// 3️⃣ Posts
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->char('user_id', 26);
$table->foreign('user_id')->references('id')->on('users')->cascadeOnDelete();
$table->string('title');
$table->text('content')->nullable();
$table->timestamps();
});
// 4️⃣ Students
Schema::create('students', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
// 5️⃣ Courses
Schema::create('courses', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->timestamps();
});
// 6️⃣ Pivot: course_student
Schema::create('course_student', function (Blueprint $table) {
$table->id();
$table->foreignId('course_id')->constrained()->cascadeOnDelete();
$table->foreignId('student_id')->constrained()->cascadeOnDelete();
$table->string('grade')->nullable();
$table->string('semester')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
if (Schema::hasColumn('users', 'country_id')) {
$table->dropConstrainedForeignId('country_id');
}
});
Schema::dropIfExists('course_student');
Schema::dropIfExists('courses');
Schema::dropIfExists('students');
Schema::dropIfExists('posts');
Schema::dropIfExists('countries');
}
};
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CountrySeeder extends Seeder
{
public function run(): void
{
DB::table('countries')->insert([
['name' => 'Malaysia'],
['name' => 'Singapore'],
['name' => 'Thailand'],
]);
}
}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CourseSeeder extends Seeder
{
public function run(): void
{
DB::table('courses')->insert([
['title' => 'Laravel Basics'],
['title' => 'Advanced Eloquent'],
['title' => 'Database Optimization'],
]);
}
}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use App\Models\Student;
use App\Models\Course;
class CourseStudentSeeder extends Seeder
{
public function run(): void
{
$students = Student::all();
$courses = Course::all();
foreach ($students as $student) {
foreach ($courses->random(2) as $course) {
DB::table('course_student')->insert([
'student_id' => $student->id,
'course_id' => $course->id,
'grade' => ['A', 'B', 'C'][rand(0,2)],
'semester' => rand(1, 4),
]);
}
}
}
}
......@@ -14,6 +14,14 @@ class DatabaseSeeder extends Seeder
public function run(): void
{
// User::factory(10)->create();
$this->call([
CountrySeeder::class,
UserSeeder::class,
PostSeeder::class,
StudentSeeder::class,
CourseSeeder::class,
CourseStudentSeeder::class,
]);
User::factory()->create([
'name' => 'Test User',
......
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\Post;
class PostSeeder extends Seeder
{
public function run(): void
{
$users = User::all();
foreach ($users as $user) {
Post::factory()->count(3)->create([
'user_id' => $user->id,
]);
}
}
}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class StudentSeeder extends Seeder
{
public function run(): void
{
DB::table('students')->insert([
['name' => 'Ali'],
['name' => 'Siti'],
['name' => 'John'],
]);
}
}
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use App\Models\Country;
use Carbon\Carbon;
class UserSeeder extends Seeder
{
public function run(): void
{
$now = Carbon::now();
$countries = Country::all();
$users = [
['name' => 'Alice Admin', 'email' => 'alice@demo.com', 'role' => 'admin', 'status' => 'active', 'last_login_at' => $now->subDays(5)],
['name' => 'Bob Staff', 'email' => 'bob@demo.com', 'role' => 'staff', 'status' => 'active', 'last_login_at' => $now->subDays(10)],
['name' => 'Charlie Manager', 'email' => 'charlie@demo.com', 'role' => 'manager', 'status' => 'inactive', 'last_login_at' => $now->subDays(40)],
['name' => 'Diana Staff', 'email' => 'diana@demo.com', 'role' => 'staff', 'status' => 'active', 'last_login_at' => $now->subDays(20)],
['name' => 'Evan Admin', 'email' => 'evan@demo.com', 'role' => 'admin', 'status' => 'inactive', 'last_login_at' => $now->subDays(2)],
];
foreach ($users as $user) {
User::create([
'name' => $user['name'],
'email' => $user['email'],
'password' => Hash::make('password'), // default password
'role' => $user['role'],
'status' => $user['status'],
'last_login_at' => $user['last_login_at'],
'country_id' => $countries->random()->id, // assign random country
]);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment