tutorial101 is the one place for high quality web development, Web Design and software development tutorials and Resources programming. Learn cutting edge techniques in web development, design and software development, download source components and participate in the community.
myapp>php artisan migrate
Migration table created successfully.
check database table
php artisan make:controller UsersController
change it with the following codes: app\Http\Controllers\UsersController.php
//app\Http\Controllers\UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\User;
class UsersController extends Controller
{
public function home()
{
$query = User::select('id', 'name', 'email', 'created_at')->latest();
// Handle search
if (request()->has('search')) {
$search = request('search');
$query->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
}
$users = $query->paginate(10);
return Inertia::render('users/index', [
'users' => $users,
'filters' => [
'search' => request('search', ''),
]
]);
}
}
Frontend with React and InertiaJS
Add sidebar menu product mainNavItems from reactjs\rescourses\js\components\app-sidebar.tsx File: pages\users\index.tsx
reactjs\resources\js\pages\users\index.tsx
myapp>php artisan migrate
Migration table created successfully.
check database table
Create tables Schedule Model
php artisan make:model Schedule -m
myapp>php artisan make:model Schedule -m
Open new Schedule migrations
yourproject/database/migrations
laravelproject\database\migrations\_create_schedule_table.php
//laravelproject\database\migrations\_create_schedule_table.php
<?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
{
Schema::create('schedules', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->dateTime('start');
$table->dateTime('end');
$table->string('color')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('schedules');
}
};
run
myapp>php artisan migrate
update Schedule Model app/models/Schedule.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Schedule extends Model
{
use HasFactory;
protected $fillable = [
'title',
'start',
'end',
'color',
];
}
Create ScheduleController
php artisan make:controller ScheduleController
change it with the following codes: app\Http\Controllers\ScheduleController.php
//app\Http\Controllers\ScheduleController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\Schedule;
class ScheduleController extends Controller
{
public function index()
{
$query = Schedule::select('id', 'title', 'start', 'end', 'color', 'created_at')->get();
return Inertia::render('schedule/index', [
'schedules' => $query,
'flash' => [
'success' => session('success'),
'error' => session('error')
]
]);
}
public function store(Request $request)
{
Schedule::create([
'title' => $request->title,
'start' => $request->startdate,
'end' => $request->enddate,
'color' => $request->color,
]);
return redirect()->route('schedule.index')->with('success', 'Schedule created successfully!');
}
public function destroy($id)
{
Schedule::findOrFail($id)->delete();
return redirect()->route('schedule.index')->with('success', 'Schedule Deleted successfully!');
}
public function update(Request $request, $id)
{
$schedule = Schedule::findOrFail($id);
$schedule->update($request->only('start', 'end'));
return redirect()->route('schedule.index')->with('success', 'Schedule Updated successfully!');
}
}
Frontend with React and InertiaJS
Add sidebar menu product mainNavItems from reactjs\rescourses\js\components\app-sidebar.tsx Index.tsxFile: pages\schedule\index.tsx
reactjs\resources\js\pages\schedule\index.tsx
myapp>php artisan migrate
Migration table created successfully.
check database table
Create tables Schedule Model
php artisan make:model Schedule -m
myapp>php artisan make:model Schedule -m
Open new Schedule migrations
yourproject/database/migrations
laravelproject\database\migrations\_create_schedule_table.php
//laravelproject\database\migrations\_create_schedule_table.php
<?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
{
Schema::create('schedules', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->dateTime('start');
$table->dateTime('end');
$table->string('color')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('schedules');
}
};
run
myapp>php artisan migrate
update Schedule Model app/models/Schedule.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Schedule extends Model
{
use HasFactory;
protected $fillable = [
'title',
'start',
'end',
'color',
];
}
Create ScheduleController
php artisan make:controller ScheduleController
change it with the following codes: app\Http\Controllers\ScheduleController.php
//app\Http\Controllers\ScheduleController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Schedule;
use Carbon\Carbon;
class ScheduleController extends Controller
{
public function index()
{
return view('schedule.index');
}
public function store(Request $request)
{
$item = new Schedule();
$item->title = $request->title;
$item->start = $request->start;
$item->end = $request->end;
$item->color = $request->color;
$item->save();
return redirect()->route("schedule.index");
}
public function getEvents()
{
$schedules = Schedule::all();
return response()->json($schedules);
}
public function update(Request $request, $id)
{
$schedule = Schedule::findOrFail($id);
$schedule->update([
'start' => Carbon::parse($request->input('start_date'))->setTimezone('UTC'),
'end' => Carbon::parse($request->input('end_date'))->setTimezone('UTC'),
]);
return response()->json(['message' => 'Event moved successfully']);
}
public function deleteEvent($id)
{
$schedule = Schedule::findOrFail($id);
$schedule->delete();
return response()->json(['message' => 'Event deleted successfully']);
}
public function search(Request $request)
{
$searchKeywords = $request->input('title');
$matchingEvents = Schedule::where('title', 'like', '%' . $searchKeywords . '%')->get();
return response()->json($matchingEvents);
}
}
Create AuthController
php artisan make:controller AuthController
change it with the following codes: app\Http\Controllers\AuthController.php
//app\Http\Controllers\AuthController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
public function login()
{
$pass = Hash::make("123456789");
return view("login")->with('password', $pass);
}
public function loginAction(Request $request)
{
$validated = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (!Auth::attempt($request->only('email', 'password'), $request->boolean('remember'))) {
throw ValidationException::withMessages([
'email' => trans('auth.failed')
]);
}
$request->session()->regenerate();
return redirect()->route("products.index")->with("success", "Login successfully");
}
public function logout(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
return redirect('/login');
}
}
myapp>php artisan migrate
Migration table created successfully.
check database table
php artisan make:controller UsersController
change it with the following codes: app\Http\Controllers\UsersController.php
//app\Http\Controllers\UsersController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\User;
class UsersController extends Controller
{
public function home()
{
$query = User::select('id', 'name', 'email', 'created_at')->latest();
// Handle search
if (request()->has('search')) {
$search = request('search');
$query->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%");
});
}
$users = $query->paginate(10);
return Inertia::render('users/index', [
'users' => $users,
'filters' => [
'search' => request('search', ''),
]
]);
}
}
Frontend with React and InertiaJS
Add sidebar menu product mainNavItems from reactjs\rescourses\js\components\app-sidebar.tsx File: pages\users\index.tsx
reactjs\resources\js\pages\users\index.tsx
myapp>php artisan migrate
Migration table created successfully.
check database table
Create tables Product Model
php artisan make:model Product -m
myapp>php artisan make:model Product -m
Open new Products migrations
yourproject/database/migrations
laravelproject\database\migrations\_create_products_table.php
//laravelproject\database\migrations\_create_products_table.php
<?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
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('description')->nullable();
$table->integer('quantity');
$table->float('price');
$table->string('image')->nullable();
$table->enum('status', ['active', 'in-active'])->default('active');
$table->softDeletes();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('products');
}
};
run
myapp>php artisan migrate
update Product Model app/models/Product.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
class Product extends Model
{
use SoftDeletes, HasFactory;
protected $fillable = [
"name",
"description",
"quantity",
"price",
"status",
"image",
];
}
Create PostController
php artisan make:controller PostController
change it with the following codes: app\Http\Controllers\PostController.php
//app\Http\Controllers\ProductController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Product;
use Illuminate\Support\Facades\Storage;
class ProductController extends Controller
{
public function index(Request $request)
{
// $products = Product::all();
$query = Product::query();
if (request()->has("search") && $request->search) {
$query = $query->where("name", "like", "%" . $request->search . "%")
->orWhere('description', 'like', "%" . $request->search . "%");
}
$products = $query->latest()->paginate(3);
return view("product.index", compact("products"));
}
public function create()
{
return view("product.create");
}
public function store(Request $request)
{
$validated = $request->validate([
"name" => "required|string",
"description" => "nullable|string",
"price" => "required|numeric",
"quantity" => "required|numeric",
"status" => "required",
"image" => "nullable|image|mimes:jpg,png",
]);
if ($request->hasFile("image")) { //php artisan storage:link
$validated["image"] = $request->file("image")->store("products", "public");
}
Product::create($validated);
return redirect()->route("products.index")->with("success", "product added successfully");
}
public function show($id)
{
$product = Product::find($id);
return view("product.show", compact("product"));
}
public function edit($id)
{
$product = Product::find($id);
return view("product.edit", compact("product"));
}
public function update(Request $request, $id)
{
$validated = $request->validate([
"name" => "required|string",
"description" => "nullable|string",
"price" => "required|numeric",
"quantity" => "required|numeric",
"status" => "required",
"image" => "nullable|image|mimes:jpg,png",
]);
if ($request->hasFile("image")) {
if ($request->image && Storage::disk("public")->exists($request->image)) {
Storage::disk("public")->delete($request->image);
}
$validated["image"] = $request->file("image")->store("products", "public");
}
Product::find($id)->update($validated);
return redirect()->route("products.index")->with("success", "product updated successfully!");
}
public function destroy($id)
{
Product::find($id)->delete();
return redirect()->route("products.index")->with("success", "product deleted successfully!");
}
public function trashedProducts(Request $request)
{
$query = Product::query()->onlyTrashed();
$products = $query->paginate(3);
return view("product.deleted-products", compact("products"));
}
public function showTrashed($id)
{
$product = Product::onlyTrashed()->findOrFail($id);
return view("product.show", compact("product"));
}
public function restoreProduct($id)
{
$product = Product::onlyTrashed()->findOrFail($id);
$product->restore();
return redirect()->route("products.index")->with("success", "product restored successfully");
}
public function destroyProduct($id)
{
$product = Product::onlyTrashed()->findOrFail($id);
if ($product->image && Storage::exists($product->image)) {
Storage::delete($product->image);
}
$product->forceDelete();
return redirect()->route("products.index")->with("success", "product was force deleted successfully!");
}
}
Create AuthController
php artisan make:controller AuthController
change it with the following codes: app\Http\Controllers\AuthController.php
//app\Http\Controllers\AuthController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
class AuthController extends Controller
{
public function login()
{
$pass = Hash::make("123456789");
return view("login")->with('password', $pass);
}
public function loginAction(Request $request)
{
$validated = $request->validate([
'email' => 'required|email',
'password' => 'required'
]);
if (!Auth::attempt($request->only('email', 'password'), $request->boolean('remember'))) {
throw ValidationException::withMessages([
'email' => trans('auth.failed')
]);
}
$request->session()->regenerate();
return redirect()->route("products.index")->with("success", "Login successfully");
}
public function logout(Request $request)
{
Auth::guard('web')->logout();
$request->session()->invalidate();
return redirect('/login');
}
}
myapp>php artisan migrate
Migration table created successfully.
check database table
Create tables Post Model
php artisan make:model Post -m
myapp>php artisan make:model Post -m
Open new products migrations
yourproject/database/migrations
laravelproject\database\migrations\_create_posts_table.php
//laravelproject\database\migrations\_create_posts_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('content');
$table->integer('categories_id');
$table->boolean('poststatus')->default(false);
$table->string('slug');
$table->string('picture')->nullable(); // Add picture column (nullable)
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('posts');
}
};
Create tables Category Model
php artisan make:model Category -m
myapp>php artisan make:model Category -m
Open new products migrations
yourproject/database/migrations
laravelproject\database\migrations\_create_categories_table.php
//laravelproject\database\migrations\_create_categories_table.php
return new class extends Migration
{
public function up(): void
{
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->timestamps();
});
}
public function down(): void
{
Schema::dropIfExists('categories');
}
};
run
myapp>php artisan migrate
update Post Model app/models/Post.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Post extends Model
{
use HasFactory;
protected $fillable = [
'title',
'content',
'poststatus',
'slug',
'picture',
'categories_id'
];
protected $casts = [
'poststatus' => 'boolean'
];
public function categories(): BelongsTo
{
return $this->belongsTo(Category::class, 'categories_id');
}
}
update Category Model app/models/Category.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'title',
'user_id'
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
}
Create PostController
php artisan make:controller PostController
change it with the following codes: app\Http\Controllers\PostController.php
//app\Http\Controllers\PostController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\Category;
use App\Models\Post;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
class PostController extends Controller
{
public function index()
{
$query = Post::with('categories')
->whereHas('categories', function ($query) {
$query->where('user_id', auth()->id());
})
->orderBy('created_at', 'desc');
// Handle search
if (request()->has('search')) {
$search = request('search');
$query->where(function ($q) use ($search) {
$q->where('title', 'like', "%{$search}%")
->orWhere('content', 'like', "%{$search}%");
});
}
// Handle filter
if (request()->has('filter') && request('filter') !== 'all') {
$query->where('poststatus', request('filter') === 'published');
}
$posts = $query->paginate(2);
$categories = Category::where('user_id', auth()->id())->get();
return Inertia::render('posts/index', [
'posts' => $posts,
'categories' => $categories,
'filters' => [
'search' => request('search', ''),
'filter' => request('filter', 'all'),
],
'flash' => [
'success' => session('success'),
'error' => session('error')
]
]);
}
public function create()
{
$categories = Category::where('user_id', auth()->id())->get();
return Inertia::render('posts/create', [
'categories' => $categories,
'flash' => [
'success' => session('success'),
'error' => session('error')
]
]);
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'categories_id' => 'required|exists:categories,id',
'poststatus' => 'boolean',
'picture' => 'required|image',
]);
$title = $request->input('title');
$validated['slug'] = Str::slug($title);
if ($request->hasFile('picture')) {
$validated['picture'] = Storage::disk('public')->put('posts', $request->file('picture'));
}
Post::create($validated);
return redirect()->route('posts.index')->with('success', 'Post created successfully!');
}
public function edit(Post $post)
{
$categories = Category::where('user_id', auth()->id())->get();
return Inertia::render('posts/edit', [
'post' => $post,
'categories' => $categories,
]);
}
public function update(Request $request, Post $post)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'content' => 'required|string',
'categories_id' => 'required|exists:categories,id',
'poststatus' => 'boolean',
'picture' => 'required|image',
]);
$title = $request->input('title');
$data['slug'] = Str::slug($title);
if ($request->hasFile('picture')) {
Storage::disk('public')->delete($post->picture);
$data['picture'] = Storage::disk('public')->put('posts', $request->file('picture'));
}
$post->update($data);
return redirect()->route('posts.index')->with('success', 'Post updated successfully!');
}
public function destroy(Post $post)
{
Storage::disk('public')->delete($post->picture);
$post->delete();
return redirect()->route('posts.index')->with('success', 'Post deleted successfully!');
}
}
Create CategoryController
php artisan make:controller CategoryController
change it with the following codes: app\Http\Controllers\CategoryController.php
//app\Http\Controllers\CategoryController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\Category;
class CategoryController extends Controller
{
public function index()
{
$categories = Category::where('user_id', auth()->id())
->get();
return Inertia::render('category/index', [
'categories' => $categories,
'flash' => [
'success' => session('success'),
'error' => session('error')
]
]);
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255'
]);
Category::create([
...$validated,
'user_id' => auth()->id()
]);
return redirect()->route('category.index')->with('success', 'Category created successfully!');
}
public function update(Request $request, Category $category)
{
$validated = $request->validate([
'title' => 'required|string|max:255'
]);
$category->update($validated);
return redirect()->route('category.index')->with('success', 'Categroy updated successfully! ' . $validated['title'] . ' ');
}
public function destroy(Category $category)
{
$category->delete();
return redirect()->route('category.index')->with('success', 'Category deleted successfully!');
}
}
Frontend with React and InertiaJS
Add sidebar menu product mainNavItems from reactjs\rescourses\js\components\app-sidebar.tsx Index.tsxFile: pages\posts\index.tsx
reactjs\resources\js\pages\posts\index.tsx