1. Go to this page and download the library: Download bywyd/laravel-qol library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
bywyd / laravel-qol example snippets
use Bywyd\LaravelQol\Traits\HasHistory;
class Post extends Model
{
use HasHistory;
// Optional: Exclude specific attributes from history
protected $historyExcludedAttributes = ['views', 'updated_at'];
// Optional: Only log specific events
protected $historyEvents = ['created', 'updated'];
// Optional: Keep histories when model is deleted
protected $deleteHistoriesOnDelete = false;
}
// Usage
$post = Post::find(1);
$post->histories; // Get all history records
$post->latestHistory; // Get the latest history
// Manual history logging
$post->logHistory(HistoryLogTypes::CUSTOM, 'Custom action performed');
// Temporarily disable history logging
$post->withoutHistory(function($post) {
$post->update(['title' => 'No history logged']);
});
use Bywyd\LaravelQol\Traits\HasImages;
class Product extends Model
{
use HasImages;
}
// Usage
$product = Product::find(1);
// Upload an image
$image = $product->uploadImage($request->file('image'), 0, 'gallery');
// Get all images
$product->images;
// Get images by tag
$product->imagesByTag('gallery');
// Get primary image
$product->primaryImage();
// Reorder images
$product->reorderImages([3, 1, 2]); // Array of image IDs
// Delete an image
$product->deleteImage($image);
// Delete all images
$product->deleteAllImages();
use Bywyd\LaravelQol\Traits\HasFiles;
class Document extends Model
{
use HasFiles;
}
// Usage
$document = Document::find(1);
// Upload a file
$file = $document->uploadFile($request->file('attachment'), 0, 'contract', [
'department' => 'Legal'
]);
// Get all files
$document->files;
// Get files by tag
$document->filesByTag('contract');
// Get document files (PDFs, DOCs, etc.)
$document->documents();
// Download a file
return $file->download();
// Delete a file
$document->deleteFile($file);
use Bywyd\LaravelQol\Traits\HasVideos;
class Course extends Model
{
use HasVideos;
}
// Usage
$course = Course::find(1);
// Upload a video
$video = $course->uploadVideo($request->file('video'), 0, 'lesson-1');
// Access video properties
$video->url; // Public URL
$video->human_size; // "50.5 MB"
$video->human_duration; // "5:23"
$video->aspect_ratio; // "16:9"
// Quality checks
$video->isHD(); // 720p or higher
$video->isFullHD(); // 1080p or higher
$video->is4K(); // 2160p or higher
// Get HD videos
$course->hdVideos();
// Delete a video
$course->deleteVideo($video);
use Bywyd\LaravelQol\Traits\HasUuid;
class User extends Model
{
use HasUuid;
// Optional: Customize UUID column
protected $uuidColumn = 'uuid';
}
// Usage
$user = User::create(['name' => 'John']);
$user->uuid; // "550e8400-e29b-41d4-a716-446655440000"
// Find by UUID
$user = User::findByUuid('550e8400-e29b-41d4-a716-446655440000');
$user = User::findByUuidOrFail($uuid);
use Bywyd\LaravelQol\Traits\HasSlug;
class Article extends Model
{
use HasSlug;
// Optional: Customize slug source
protected $slugSource = 'title';
// Optional: Customize slug column
protected $slugColumn = 'slug';
// Optional: Prevent regeneration on update
protected $regenerateSlugOnUpdate = false;
}
// Usage
$article = Article::create(['title' => 'Hello World']);
$article->slug; // "hello-world"
// Find by slug
$article = Article::findBySlug('hello-world');
$article = Article::findBySlugOrFail('hello-world');
use Bywyd\LaravelQol\Traits\HasStatus;
class Task extends Model
{
use HasStatus;
// Optional: Customize status column
protected $statusColumn = 'status';
// Optional: Customize status values
protected $activeStatusValue = 1;
protected $inactiveStatusValue = 0;
}
// Usage
$task = Task::find(1);
// Status checks
$task->isActive();
$task->isInactive();
// Status changes
$task->activate();
$task->deactivate();
$task->toggleStatus();
// Query scopes
Task::active()->get();
Task::inactive()->get();
Task::status(1)->get();
use Bywyd\LaravelQol\Traits\Sortable;
class MenuItem extends Model
{
use Sortable;
// Optional: Customize sort column
protected $sortColumn = 'order';
}
// Usage
$item = MenuItem::find(1);
// Move operations
$item->moveUp();
$item->moveDown();
$item->moveTo(5);
$item->swapWith($otherItem);
// Query scope
MenuItem::ordered()->get(); // Ordered by sort column
MenuItem::ordered('desc')->get();
use Bywyd\LaravelQol\Traits\Searchable;
class Product extends Model
{
use Searchable;
// Define searchable columns
protected $searchable = ['name', 'description', 'category.name'];
}
// Usage
// Simple search
Product::search('laptop')->get();
// Custom columns
Product::search('laptop', ['name', 'sku'])->get();
// Full-text search (MySQL)
Product::fullTextSearch('gaming laptop')->get();
use Bywyd\LaravelQol\Traits\HasRoles;
class User extends Authenticatable
{
use HasRoles;
}
// Assign roles
$user->assignRole('admin');
$user->assignRole(['editor', 'moderator']);
// Remove roles
$user->removeRole('editor');
// Sync roles (removes all existing roles and assigns new ones)
$user->syncRoles(['admin', 'super-admin']);
// Check roles
$user->hasRole('admin'); // true
$user->hasAnyRole(['admin', 'editor']); // true if user has any
$user->hasAllRoles(['admin', 'editor']); // true if user has all
// Give direct permissions
$user->givePermission('edit-posts');
$user->givePermission(['edit-posts', 'delete-posts']);
// Revoke permissions
$user->revokePermission('delete-posts');
// Sync permissions
$user->syncPermissions(['edit-posts', 'view-posts']);
// Check permissions
$user->hasPermission('edit-posts'); // true
$user->hasAnyPermission(['edit-posts', 'delete-posts']); // true if has any
$user->hasAllPermissions(['edit-posts', 'view-posts']); // true if has all
// Get all permissions (direct + from roles)
$user->getAllPermissions();
// Check super admin
$user->isSuperAdmin(); // true if has super-admin role or * permission
// Query scopes
User::role('admin')->get();
User::role(['admin', 'editor'])->get();
User::permission('edit-posts')->get();
User::permission(['edit-posts', 'delete-posts'])->get();
use Bywyd\LaravelQol\Models\Role;
// Create a role
$role = Role::create([
'name' => 'Administrator',
'slug' => 'admin',
'description' => 'Full access to the system',
'level' => 100, // Higher = more privileges
'is_default' => false,
]);
// Assign permissions to role
$role->givePermission('edit-posts');
$role->givePermission(['delete-posts', 'manage-users']);
// Revoke permissions
$role->revokePermission('delete-posts');
// Sync permissions
$role->syncPermissions(['edit-posts', 'view-posts']);
// Check if role has permission
$role->hasPermission('edit-posts'); // true
// Check if super admin
$role->isSuperAdmin(); // true if has * permission
// Get users with this role
$role->users;
// Query scopes
Role::default()->first(); // Get default role
Role::byLevel()->get(); // Order by level
Role::byLevel('desc')->get();
use Bywyd\LaravelQol\Models\Permission;
// Create a permission
$permission = Permission::create([
'name' => 'Edit Posts',
'slug' => 'edit-posts',
'description' => 'Can create and edit posts',
'group' => 'posts', // Group related permissions
]);
// Get permissions by group
Permission::byGroup('posts')->get();
// Get all permissions grouped
$grouped = Permission::getAllGrouped();
// Returns: ['posts' => [...], 'users' => [...]]
// Wildcard permission (grants all permissions)
Permission::create([
'name' => 'All Permissions',
'slug' => '*',
'description' => 'Super admin permission',
]);
// In your controller or anywhere
if (Gate::allows('edit-posts')) {
// User can edit posts
}
if (Gate::denies('delete-posts')) {
// User cannot delete posts
}
// Using authorize
$this->authorize('edit-posts');
// In routes
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])
->can('edit-posts');
// In your Policy
public function update(User $user, Post $post)
{
return $user->hasPermission('edit-posts') || $user->id === $post->user_id;
}
public function delete(User $user, Post $post)
{
return $user->hasPermission('delete-posts') ||
$user->hasRole('admin');
}
use Bywyd\LaravelQol\Traits\CommonScopes;
class Product extends Model
{
use CommonScopes;
}
// Usage examples:
Product::active()->get();
Product::recent(7)->get(); // Last 7 days
Product::thisMonth()->get();
Product::popular('views_count', 100)->get();
Product::published()->get();
Product::whereLike('search term', ['name', 'description'])->get();
Product::smartPaginate(20); // Auto-handles per_page from request
use Bywyd\LaravelQol\Traits\ApiResponse;
class UserController extends Controller
{
use ApiResponse;
public function index()
{
$users = User::paginate();
return $this->paginated($users, 'Users retrieved successfully');
}
public function store(Request $request)
{
$user = User::create($request->validated());
return $this->created($user, 'User created successfully');
}
public function show(User $user)
{
return $this->success($user);
}
public function update(Request $request, User $user)
{
$user->update($request->validated());
return $this->updated($user);
}
public function destroy(User $user)
{
$user->delete();
return $this->deleted();
}
}
// Check if any of the keys exist
if (request()->hasAny(['email', 'username'])) {
// ...
}
// Check if all keys exist
if (request()->hasAll(['name', 'email', 'password'])) {
// ...
}
// Get boolean value (handles 'true', '1', 'yes', 'on')
$active = request()->boolean('is_active', false);
// Get array of IDs from comma-separated or array
$ids = request()->ids('user_ids'); // "1,2,3" or [1,2,3] => [1,2,3]
// Get sanitized search term
$search = request()->search('q');
// Get real IP (considering proxies, Cloudflare, etc.)
$ip = request()->realIp();
// Check if mobile device
if (request()->isMobile()) {
// ...
}
// Get sort parameters
$sort = request()->sort('created_at', 'desc');
// Returns: ['column' => 'created_at', 'direction' => 'desc']
// Get filters (removes empty values)
$filters = request()->filters(['status', 'category', 'price_min']);
// Recursively convert to array
$data = collect($nested)->recursive()->toArray();
// Group by multiple keys
$grouped = $users->groupByMultiple(['country', 'city']);
// Export to CSV
$csv = $users->toCsv(['ID', 'Name', 'Email']);
// Check for duplicates
if ($items->hasDuplicates('email')) {
// ...
}
// Transpose (rows to columns)
$transposed = collect([[1, 2], [3, 4]])->transpose();
// Result: [[1, 3], [2, 4]]
// Get statistics
$stats = $numbers->stats();
// Returns: ['count', 'sum', 'avg', 'min', 'max', 'median']
// Filter null/empty values
$filtered = $collection->filterNull()->filterEmpty();
// Manual pagination
$paginated = $collection->paginate(15);
use Bywyd\LaravelQol\Rules\PhoneNumber;
use Bywyd\LaravelQol\Rules\StrongPassword;
use Bywyd\LaravelQol\Rules\Username;
// Phone number validation
'phone' => ['rcase: true,
true,
allowUnderscore: true,
allowDot: false
)
],
// Limit words in string
$excerpt = str_limit_words($text, 10);
// Simple money formatting
$price = money_format_simple(1234.56, '$', 2); // "$1,234.56"
// Calculate percentage
$percent = percentage(25, 100); // 25.00
// Filter array recursively
$filtered = array_filter_recursive($array);
// Sanitize filename
$safe = sanitize_filename('My File (1).pdf'); // "My_File_1.pdf"
// Generate random string
$token = generate_random_string(32); // Alphanumeric
$password = generate_random_string(16, false); // With special chars
// Convert bytes to human readable
$size = bytes_to_human(1048576); // "1.00 MB"
// Convert human readable to bytes
$bytes = human_to_bytes('10MB'); // 10485760
// Check if string is valid JSON
if (is_json($string)) {
// ...
}
// Safe Carbon parsing
$date = carbon_parse_safe($input, now());
// Active route helper (for navigation)
<li class="{{ active_route(['users.*', 'profile']) }}">Users</li>
// Get client browser
$browser = get_client_browser(); // "Chrome", "Firefox", etc.
// Truncate middle of string
$truncated = truncate_middle('very-long-filename.txt', 20); // "very-long...ame.txt"
use Bywyd\LaravelQol\Utilities\QueryLogger;
// Enable query logging
QueryLogger::enable();
// Your code here...
User::all();
Post::with('comments')->get();
// Get all queries
$queries = QueryLogger::getQueries();
// Get total execution time
$time = QueryLogger::getTotalTime(); // in milliseconds
// Get query count
$count = QueryLogger::getCount();
// Get slowest queries
$slow = QueryLogger::getSlowestQueries(10);
// Log to file
QueryLogger::logToFile('database');
// Dump for debugging
QueryLogger::dump();
// Clear logged queries
QueryLogger::clear();
// Disable logging
QueryLogger::disable();
use Bywyd\LaravelQol\Utilities\ModelUtility;
// Get table columns
$columns = ModelUtility::getTableColumns(User::class);
// Get fillable columns
$fillable = ModelUtility::getFillableColumns($user);
// Get hidden columns
$hidden = ModelUtility::getHiddenColumns($user);
// Get dirty (changed but not saved) attributes
$dirty = ModelUtility::getDirtyAttributes($user);
// Get changed attributes after save
$changes = ModelUtility::getChangedAttributes($user);
// Check if attribute exists
if (ModelUtility::hasAttribute($user, 'email')) {
// ...
}
// Clone model
$clone = ModelUtility::cloneModel($user, ['id', 'created_at']);
// Get loaded relations
$relations = ModelUtility::getLoadedRelations($user);
// Check if relation is loaded
if (ModelUtility::isRelationLoaded($user, 'posts')) {
// ...
}
// Diff two models
$diff = ModelUtility::diff($originalUser, $modifiedUser);
// Returns: ['email' => ['old' => '[email protected]', 'new' => '[email protected]']]
use App\Models\Product;
use Bywyd\LaravelQol\Traits\ApiResponse;
use Bywyd\LaravelQol\Rules\StrongPassword;
use Illuminate\Http\Request;
class ProductController extends Controller
{
use ApiResponse;
public function index(Request $request)
{
$query = Product::query();
// Use CommonScopes
if ($request->boolean('active_only')) {
$query->active();
}
if ($search = $request->search('q')) {
$query->whereLike($search, ['name', 'description']);
}
// Use Request macros for sorting
$sort = $request->sort('created_at', 'desc');
$query->orderBy($sort['column'], $sort['direction']);
// Smart pagination
$products = $query->smartPaginate();
return $this->paginated($products, 'Products retrieved successfully');
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => '
use Bywyd\LaravelQol\Utilities\QueryLogger;
// In a middleware or service provider
if (app()->environment('local')) {
QueryLogger::enable();
app()->terminating(function () {
if (QueryLogger::getCount() > 50) {
logger()->warning('High query count detected', [
'total_queries' => QueryLogger::getCount(),
'total_time' => QueryLogger::getTotalTime(),
'slowest' => QueryLogger::getSlowestQueries(5),
]);
}
});
}
use Illuminate\Database\Eloquent\Model;
use Bywyd\LaravelQol\Traits\{
HasHistory,
HasRoles,
HasSettings,
HasUuid,
HasSlug,
HasStatus,
Sortable,
Cacheable,
Searchable,
CommonScopes
};
class Article extends Model
{
use HasHistory,
HasRoles,
HasSettings,
HasUuid,
HasSlug,
HasStatus,
Sortable,
Cacheable,
Searchable,
CommonScopes;
protected $fillable = ['title', 'content', 'status'];
protected $slugSource = 'title';
protected $searchable = ['title', 'content'];
// Now you have access to all features:
// - History tracking
// - Role-based permissions
// - Per-model settings
// - UUID primary key
// - Auto-generated slugs
// - Status management
// - Sortable ordering
// - Model caching
// - Full-text search
// - Query scopes
}
// Usage
$article = Article::create(['title' => 'My Article', 'content' => '...']);
$article->logHistory(HistoryLogTypes::CUSTOM, 'Published');
$article->setSetting('views_count', 0);
$articles = Article::active()->published()->thisMonth()->get();