[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tips":3},{"tips":4,"pagination":91},[5,21,32,45,55,65,74,83],{"id":6,"title":7,"slug":8,"short_description":9,"content":10,"author":11,"is_enabled":12,"created_at":13,"updated_at":14,"reading_time":15,"tags":16,"next_slug":20,"previous_slug":20},8,"Laravel required_array_keys Validation","laravel-required-array-keys-validation","required_array_keys validation rule for array validation. Learn setup, use cases, and practical examples for API requests, settings, and nested data validation.","\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">What is \u003Ccode>required_array_keys\u003C/code>?\u003C/h2>\r\n\u003Cp>Validates that a field is an array AND contains specific required keys. Perfect for validating structured data like API payloads, settings objects, and configuration arrays.\u003C/p>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Basic Use Case\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$request-&gt;validate([\r\n    'settings' =&gt; 'required_array_keys:theme,language',\r\n]);\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>The \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">settings\u003C/code> field must:\u003C/strong>\u003C/p>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Be an \u003Ccode>array\u003C/code>\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Have \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">theme\u003C/code> key\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Have \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">language\u003C/code> key\u003C/li>\r\n\u003C/ul>\r\n\u003Chr>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\r\n\u003Cdiv class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\r\n\u003Cdiv style=\"border: 1px solid #ddd; border-radius: 8px; padding: 12px; background: #f9f9f9;\">\u003Cstrong style=\"color: #169179;\">Pro Tip:\u003C/strong> Use \u003Ccode>required_array_keys\u003C/code> for structured API data to ensure clients send complete payloads. Combine with nested validation rules for robust input checking.\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003C/div>","ssbhattarai",true,"2026-02-09T11:56:07.000000Z","2026-02-09T12:01:27.000000Z",1,[17],{"name":18,"slug":19},"Laravel","laravel",null,{"id":22,"title":23,"slug":24,"short_description":25,"content":26,"author":11,"is_enabled":12,"created_at":27,"updated_at":28,"reading_time":29,"tags":30,"next_slug":20,"previous_slug":20},7,"Laravel Conditional Migrations: shouldRun()","laravel-conditional-migrations-shouldrun","Laravel's shouldRun() method in migrations for feature flags, conditional execution, environment-based migrations, and staged deployments.","\u003Ch2>What is \u003Ccode>shouldRun()\u003C/code>?\u003C/h2>\r\n\u003Cp>Control when migrations execute by adding a \u003Ccode>shouldRun()\u003C/code> method. If it returns false, the migration is skipped during php artisan migrate.\u003C/p>\r\n\u003Cp>\u003Cstrong>Basic Use Case\u003C/strong>\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>public function shouldRun(): bool\r\n{\r\n    return app()-&gt;environment('production');\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp>Run specific migrations only in production.\u003C/p>\r\n\u003Cp>\u003Cstrong>In a real-time scenario involving a multitenant architecture, the situation would unfold as follows:\u003C/strong>\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>public function shouldRun(): bool\r\n{\r\n    return config('app.tenant_mode') === 'enterprise';\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp>Run migrations only for specific tenant tiers.\u003C/p>\r\n\u003Ch2>Complete Sample Migrations\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>&lt;?php\r\n\r\nuse Illuminate\\Database\\Migrations\\Migration;\r\nuse Illuminate\\Database\\Schema\\Blueprint;\r\nuse Illuminate\\Support\\Facades\\Schema;\r\nuse Laravel\\Pennant\\Feature;\r\n\r\nreturn new class extends Migration\r\n{\r\n    /**\r\n     * Determine if this migration should run.\r\n     */\r\n    public function shouldRun(): bool\r\n    {\r\n        return Feature::active('enable-subscriptions');\r\n    }\r\n    \r\n    /**\r\n     * Run the migrations.\r\n     */\r\n    public function up(): void\r\n    {\r\n        Schema::create('subscriptions', function (Blueprint $table) {\r\n            $table-&gt;id();\r\n            $table-&gt;foreignId('user_id')-&gt;constrained();\r\n            $table-&gt;string('plan');\r\n            $table-&gt;timestamp('expires_at');\r\n            $table-&gt;timestamps();\r\n        });\r\n    }\r\n    \r\n    /**\r\n     * Reverse the migrations.\r\n     */\r\n    public function down(): void\r\n    {\r\n        Schema::dropIfExists('subscriptions');\r\n    }\r\n};\u003C/code>\u003C/pre>\r\n\u003Cp>If you would like to see which migrations have already run and which are still pending, you may use the&nbsp;\u003Ccode>migrate:status\u003C/code>&nbsp;Artisan command:\u003C/p>\r\n\u003Cpre class=\"language-markup\">\u003Ccode>php artisan migrate:status\u003C/code>\u003C/pre>\r\n\u003Cdiv class=\"code-container\">\r\n\u003Cdiv class=\"relative code-block-wrapper\">\u003Chr>\r\n\u003Cdiv class=\"line\">\u003Cspan style=\"color: #169179;\">\u003Cstrong>Pro Tip:\u003C/strong>\u003C/span> Use \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">shouldRun()\u003C/code> for optional features, but never for critical schema changes. Critical migrations should always run to keep databases in sync.&nbsp;\u003C/div>\r\n\u003C/div>\r\n\u003C/div>","2026-02-06T17:00:42.000000Z","2026-02-06T17:02:02.000000Z",2,[31],{"name":18,"slug":19},{"id":33,"title":34,"slug":35,"short_description":36,"content":37,"author":11,"is_enabled":12,"created_at":38,"updated_at":39,"reading_time":15,"tags":40,"next_slug":20,"previous_slug":20},6,"Laravel: Use DB Transactions","laravel-use-db-transactions","Learn Laravel database transaction tips including automatic rollback, deadlock handling, manual control, and best practices for data integrity.","\u003Cp>The \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">transaction\u003C/code> method from the \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">DB\u003C/code> facade executes database operations atomically. Any exception triggers an automatic rollback before propagating the error. \u003Cbr>Different use cases and options:\u003C/p>\r\n\u003Ch2>1. Auto Transaction (Recommended)\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>\r\nuse Illuminate\\Support\\Facades\\DB;\r\n\r\nDB::transaction(function () {\r\n    DB::update('update users set votes = 1');\r\n    DB::delete('delete from posts');\r\n});\r\n\u003C/code>\u003C/pre>\r\n\u003Cp>Auto-rollback on exception, auto-commit on success.\u003C/p>\r\n\u003Ch2>2. With Eloquent Models\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>\r\nDB::transaction(function () {\r\n    $user = User::create(['name' =&gt; 'John']);\r\n    $user-&gt;profile()-&gt;create(['bio' =&gt; 'Developer']);\r\n    $user-&gt;posts()-&gt;createMany([...]);\r\n});\r\n\u003C/code>\u003C/pre>\r\n\u003Cp>If any operation fails, everything rolls back.\u003C/p>\r\n\u003Ch2>3. Deadlock Retry\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>\r\nDB::transaction(function () {\r\n    User::find(1)-&gt;update(['votes' =&gt; 1]);\r\n    Post::where('user_id', 1)-&gt;delete();\r\n}, attempts: 5);\r\n\u003C/code>\u003C/pre>\r\n\u003Cp>Automatically retries up to 5 times on deadlock.\u003C/p>\r\n\u003Ch2>4. Return Values\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>\r\n$user = DB::transaction(function () {\r\n    return User::create(['name' =&gt; 'John']);\r\n});\r\n\r\n// $user is now available\r\n\u003C/code>\u003C/pre>\r\n\u003Ch2>5. Manual Control\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>\r\nDB::beginTransaction();\r\n\r\ntry {\r\n    User::create(['name' =&gt; 'John']);\r\n    Post::create(['title' =&gt; 'Hello']);\r\n    \r\n    DB::commit();\r\n} catch (\\Exception $e) {\r\n    DB::rollBack();\r\n    throw $e;\r\n}\r\n\u003C/code>\u003C/pre>\r\n\u003Cp>Use when you need custom logic between operations.\u003C/p>\r\n\u003Chr>\r\n\u003Cp>\u003Cspan style=\"color: #169179;\">\u003Cstrong>Pro Tip:\u003C/strong>\u003C/span> Use \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">DB::transaction()\u003C/code> for 99% of cases. Use manual transactions only when you need custom logic between operations.\u003C/p>","2026-02-05T15:12:57.000000Z","2026-02-05T15:32:36.000000Z",[41,42],{"name":18,"slug":19},{"name":43,"slug":44},"Database","database",{"id":46,"title":47,"slug":48,"short_description":49,"content":50,"author":11,"is_enabled":12,"created_at":51,"updated_at":52,"reading_time":29,"tags":53,"next_slug":20,"previous_slug":20},5,"Laravel: isDirty() & wasChanged():","laravel-isdirty-waschanged","Master Laravel's isDirty() and wasChanged() methods for tracking model changes. Learn the difference, use cases, and practical examples .","\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">What Are These Methods?\u003C/h2>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Laravel provides powerful methods to track attribute changes in Eloquent models:\u003C/p>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>\u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">isDirty()\u003C/code>\u003C/strong> - Check if attributes changed BEFORE saving\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>\u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">wasChanged()\u003C/code>\u003C/strong> - Check if attributes changed AFTER saving\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>\u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">isClean()\u003C/code>\u003C/strong> - Opposite of isDirty()\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>\u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">getOriginal()\u003C/code>\u003C/strong> - Get original values\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>\u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">getChanges()\u003C/code>\u003C/strong> - Get all changes after save\u003C/li>\r\n\u003C/ul>\r\n\u003Cp>Eloquent includes the \u003Ccode>isDirty\u003C/code>, \u003Ccode>isClean\u003C/code>, and \u003Ccode>wasChanged\u003C/code> methods to help you inspect a model&rsquo;s state and see how its attributes differ from their original values when the model was first loaded. These methods make it easy to detect whether any fields have been modified, remain unchanged, or were updated during the last save operation.\u003C/p>\r\n\u003Cp>\u003Cstrong>The Difference\u003C/strong>\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$user = User::find(1);\r\n$user-&gt;name = 'John Doe';\r\n\r\n// Before save\r\n$user-&gt;isDirty();          // true\r\n$user-&gt;isDirty('name');    // true\r\n$user-&gt;wasChanged();       // false\r\n\r\n$user-&gt;save();\r\n\r\n// After save\r\n$user-&gt;isDirty();          // false\r\n$user-&gt;wasChanged();       // true\r\n$user-&gt;wasChanged('name'); // true\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>Key Point:\u003C/strong> \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">isDirty()\u003C/code> = before save, \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">wasChanged()\u003C/code> = after save\u003Cbr>\u003Cbr>\u003C/p>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">All Available Methods\u003C/h2>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Check for Changes\u003C/h3>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Check if ANY attribute changed\r\n$model-&gt;isDirty();           // Before save\r\n$model-&gt;isClean();           // Opposite of isDirty()\r\n$model-&gt;wasChanged();        // After save\r\n\r\n// Check SPECIFIC attribute\r\n$model-&gt;isDirty('email');\r\n$model-&gt;isClean('email');\r\n$model-&gt;wasChanged('email');\r\n\r\n// Check MULTIPLE attributes\r\n$model-&gt;isDirty(['name', 'email']);\r\n$model-&gt;wasChanged(['name', 'email']);\u003C/code>\u003C/pre>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Get Values\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Get original value (before changes)\r\n$model-&gt;getOriginal();           // All original values\r\n$model-&gt;getOriginal('email');    // Specific field\r\n\r\n// Get changes (after save)\r\n$model-&gt;getChanges();            // All changed values\r\n\r\n// Get previous values (before last save)\r\n$model-&gt;getPrevious();           // All previous values\r\n$model-&gt;getPrevious('email');    // Specific field\u003C/code>\u003C/pre>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\u003Cstrong>Want to dive deeper into tracking changes?\u003C/strong> Explore alternative approaches and advanced patterns in the \u003Ca href=\"https://laravel.com/docs/12.x/eloquent#examining-attribute-changes\">full documentation\u003C/a>.\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003C/div>","2026-02-04T13:50:19.000000Z","2026-02-04T13:51:17.000000Z",[54],{"name":18,"slug":19},{"id":56,"title":57,"slug":58,"short_description":59,"content":60,"author":11,"is_enabled":12,"created_at":61,"updated_at":62,"reading_time":15,"tags":63,"next_slug":20,"previous_slug":20},4,"Laravel ObservedBy Attribute","laravel-observedby-attribute","Learn how to use Laravel 11+ ObservedBy attribute for cleaner model observers. Includes practical use cases like audit logging, notifications, cache invalidation, and more.","\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">What is ObservedBy?\u003C/h2>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">#[ObservedBy]\u003C/code> attribute (Laravel 11+) lets you attach observers directly to your model instead of registering them.\u003Cbr>\u003Cbr>\u003Cstrong>Before vs After\u003C/strong>\u003Cbr>Old Way (Laravel 10 and below):\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Model\r\nclass User extends Model {\r\n    //\r\n}\r\n\r\n// AppServiceProvider.php\r\npublic function boot(): void\r\n{\r\n    User::observe(UserObserver::class);\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>New Way (Laravel 11+):\u003C/strong>\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>use Illuminate\\Database\\Eloquent\\Attributes\\ObservedBy;\r\n\r\n#[ObservedBy([UserObserver::class])]\r\nclass User extends Model {\r\n    //\r\n}\u003C/code>\u003C/pre>\r\n\u003Ch2>\u003Cstrong>Benefits\u003C/strong>\u003C/h2>\r\n\u003Cp>\u003Cbr>\u003Cstrong style=\"font-size: 14px;\">Self-documenting\u003C/strong>\u003Cspan style=\"font-size: 14px;\"> - See observers directly on the model\u003Cbr>\u003C/span>\u003Cstrong>No service provider clutter\u003C/strong> - Everything in one place\u003Cbr>\u003Cstrong>Multiple observers\u003C/strong> - Easy to add/remove\u003Cbr>\u003Cstrong>Type-safe\u003C/strong> - IDE autocomplete support\u003Cbr>\u003Cbr>For comprehensive use cases and alternative implementation methods, refer to&nbsp;\u003Cspan style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">the&nbsp;\u003Ca href=\"https://laravel.com/docs/12.x/eloquent#observers\" target=\"_blank\" rel=\"noopener\">official documentation\u003C/a>\u003C/span>.\u003C/p>","2026-02-03T16:28:59.000000Z","2026-02-03T16:37:10.000000Z",[64],{"name":18,"slug":19},{"id":66,"title":67,"slug":68,"short_description":69,"content":70,"author":11,"is_enabled":12,"created_at":71,"updated_at":71,"reading_time":15,"tags":72,"next_slug":20,"previous_slug":20},3,"Laravel: Use when() to Avoid Ugly Conditional Queries","laravel-use-when-to-avoid-ugly-conditional-queries","Laravel’s when() method to write clean conditional queries, avoid messy if-statements, and build dynamic filters for search, APIs, and advanced query logic.","\u003Cp>Instead of wrapping queries in messy \u003Ccode data-start=\"393\" data-end=\"397\">if\u003C/code> statements, use Laravel&rsquo;s \u003Ccode data-start=\"424\" data-end=\"432\">when()\u003C/code> method to keep your queries fluent and readable.\u003C/p>\r\n\u003Ch3 data-start=\"250\" data-end=\"266\">The Ugly Way\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$query = User::query();\r\n\r\nif ($request-&gt;role) {\r\n    $query-&gt;where('role', $request-&gt;role);\r\n}\r\n\r\nif ($request-&gt;active) {\r\n    $query-&gt;where('is_active', true);\r\n}\r\n\r\n$users = $query-&gt;get();\r\n\u003C/code>\u003C/pre>\r\n\u003Cp>&nbsp;\u003C/p>\r\n\u003Ch3 data-start=\"462\" data-end=\"487\">The Clean Laravel Way\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$users = User::query()\r\n    -&gt;when($request-&gt;role, fn ($q, $role) =&gt;\r\n        $q-&gt;where('role', $role)\r\n    )\r\n    -&gt;when($request-&gt;active, fn ($q) =&gt;\r\n        $q-&gt;where('is_active', true)\r\n    )\r\n-&gt;when($request-&gt;q, fn ($q, $search) =&gt;\r\n        $q-&gt;where('name', 'like', \"%{$search}%\")\r\n    )\r\n    -&gt;get();\r\n\u003C/code>\u003C/pre>\r\n\u003Ch3 data-start=\"704\" data-end=\"724\">Why This Matters\u003C/h3>\r\n\u003Cul>\r\n\u003Cli data-start=\"726\" data-end=\"857\">Keeps queries readable\u003C/li>\r\n\u003Cli data-start=\"726\" data-end=\"857\">Avoids nested condition hell\u003C/li>\r\n\u003Cli data-start=\"726\" data-end=\"857\">Perfect for filters &amp; search APIs\u003C/li>\r\n\u003Cli data-start=\"726\" data-end=\"857\">Scales cleanly as logic grows\u003C/li>\r\n\u003C/ul>\r\n\u003Chr>\r\n\u003Cp>\u003Cspan style=\"color: #2dc26b;\">Pro Tip:\u003C/span> Add a Default Fallback with \u003Ccode data-start=\"125\" data-end=\"133\">when()\u003C/code>&rsquo;s Third Argument\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$users = User::query()\r\n    -&gt;when(\r\n        $request-&gt;sort,\r\n        fn ($q, $sort) =&gt; $q-&gt;orderBy($sort),\r\n        fn ($q) =&gt; $q-&gt;orderBy('created_at', 'desc') // default fallback\r\n    )\r\n    -&gt;get();\r\n\u003C/code>\u003C/pre>\r\n\u003Cp style=\"text-align: center;\">&nbsp;\u003C/p>","2026-02-02T16:14:14.000000Z",[73],{"name":18,"slug":19},{"id":29,"title":75,"slug":76,"short_description":77,"content":78,"author":11,"is_enabled":12,"created_at":79,"updated_at":80,"reading_time":56,"tags":81,"next_slug":20,"previous_slug":20},"Laravel Context: Share Data Across Your Request Lifecycle","laravel-context-share-data-across-your-request-lifecycle","Laravel Context is a powerful feature that allows you to capture, retrieve, and share information throughout your application's request lifecycle, including jobs and queued tasks.","\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">What is Laravel Context?\u003C/h2>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Think of Context as a request-scoped container that automatically propagates data across your entire application - from HTTP requests to queued jobs, logs, and beyond.\u003Cbr>\u003Cbr>\u003Cstrong>When to Use Context\u003C/strong>\u003C/p>\r\n\u003Col class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>Multi-tenant Applications\u003C/strong>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Store company/tenant ID for the entire request\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Automatically scope database queries\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Include tenant context in logs\u003C/li>\r\n\u003C/ul>\r\n\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>Request Tracking\u003C/strong>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Add unique trace IDs to track requests across microservices\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Debug distributed systems\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Monitor request flows\u003C/li>\r\n\u003C/ul>\r\n\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>User Context\u003C/strong>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Store authenticated user information\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Pass user preferences to queued jobs\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Include user data in logs without repetition\u003C/li>\r\n\u003C/ul>\r\n\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">\u003Cstrong>Feature Flags &amp; Permissions\u003C/strong>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Store feature flags for the request\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Cache user permissions\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Share A/B test variants\u003C/li>\r\n\u003C/ul>\r\n\u003C/li>\r\n\u003C/ol>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Basic Syntax &amp; Import\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Import the Context facade\r\nuse Illuminate\\Support\\Facades\\Context;\r\n\r\n// Basic usage\r\nContext::add('key', 'value');           // Add data\r\n$value = Context::get('key');            // Retrieve data\r\nContext::has('key');                     // Check if exists\r\nContext::forget('key');                  // Remove data\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>Available in:\u003C/strong> Laravel 11.x and 12.x\u003C/p>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Quick Start Examples\u003C/h2>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Example 1: Multi-Tenant Company ID\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// In middleware (App/Http/Middleware/SetCompanyContext.php)\r\nuse Illuminate\\Support\\Facades\\Context;\r\n\r\nclass SetCompanyContext\r\n{\r\n    public function handle(Request $request, Closure $next)\r\n    {\r\n        // Get company from header or authenticated user\r\n        $companyId = $request-&gt;header('X-Company-ID') \r\n                     ?? auth()-&gt;user()?-&gt;company_id;\r\n        \r\n        if ($companyId) {\r\n            Context::add('company_id', $companyId);\r\n        }\r\n        \r\n        return $next($request);\r\n    }\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Now, anywhere in your application:\u003C/p>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Cpre class=\"language-php\">\u003Ccode>// In a model query\r\n$companyId = Context::get('company_id');\r\n$users = User::where('company_id', $companyId)-&gt;get();\r\n\r\n// In a job (automatically available!)\r\nclass SendReport implements ShouldQueue\r\n{\r\n    public function handle()\r\n    {\r\n        $companyId = Context::get('company_id');\r\n        // Context is automatically passed to queued jobs!\r\n    }\r\n}\u003C/code>\u003C/pre>\r\n\u003C/div>\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Example 2: Request Tracking with Trace ID\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// In middleware\r\nuse Illuminate\\Support\\Str;\r\n\r\nContext::add('trace_id', Str::uuid()-&gt;toString());\r\nContext::add('url', $request-&gt;url());\r\n\r\n// Now all logs automatically include trace_id\r\nLog::info('Processing order', ['order_id' =&gt; $order-&gt;id]);\r\n// Output: Processing order. {\"order_id\":123} {\"trace_id\":\"abc-123\",\"url\":\"https://...\"}\r\n\r\n\u003C/code>\u003C/pre>\r\n\u003C/div>\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Example 3: User Preferences\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// In middleware after authentication\r\nContext::add('locale', auth()-&gt;user()-&gt;locale);\r\nContext::add('timezone', auth()-&gt;user()-&gt;timezone);\r\n\r\n// In a queued notification\r\nclass OrderShipped extends Notification implements ShouldQueue\r\n{\r\n    public function handle()\r\n    {\r\n        $locale = Context::get('locale');\r\n        App::setLocale($locale); // User gets notification in their language!\r\n    }\r\n}\u003C/code>\u003C/pre>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right\">\r\n\u003Cdiv class=\"absolute right-0 h-8 px-2 items-center inline-flex z-10\">\r\n\u003Cdiv class=\"relative\">\r\n\u003Cdiv class=\"absolute top-0 left-0 transition-all opacity-0 scale-50\">&nbsp;\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Advanced Tips &amp; Tricks\u003C/h2>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">1. Hidden Context (Sensitive Data)\u003C/h3>\r\n\u003Cpre class=\"language-php\">\u003Ccode>//Use hidden context for data you need but don't want in logs:\r\n// Won't appear in logs\r\nContext::addHidden('user_id', auth()-&gt;id());\r\nContext::addHidden('api_key', $request-&gt;header('X-API-Key'));\r\n\r\n// Retrieve when needed\r\n$userId = Context::getHidden('user_id');\r\n\r\nContext::get('user_id'); // null\r\n\r\n//All available options related to hidden\r\nContext::addHidden(/* ... */);\r\nContext::addHiddenIf(/* ... */);\r\nContext::pushHidden(/* ... */);\r\nContext::getHidden(/* ... */);\r\nContext::pullHidden(/* ... */);\r\nContext::popHidden(/* ... */);\r\nContext::onlyHidden(/* ... */);\r\nContext::exceptHidden(/* ... */);\r\nContext::allHidden(/* ... */);\r\nContext::hasHidden(/* ... */);\r\nContext::missingHidden(/* ... */);\r\nContext::forgetHidden(/* ... */);\u003C/code>\u003C/pre>\r\n\u003C/div>\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">&nbsp;\u003C/div>\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">2. Conditional Context\u003C/h3>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">The&nbsp;\u003Ccode>when\u003C/code>&nbsp;method may be used to add data to the context based on a given condition. The first closure provided to the&nbsp;\u003Ccode>when\u003C/code>&nbsp;method will be invoked if the given condition evaluates to&nbsp;\u003Ccode>true\u003C/code>, while the second closure will be invoked if the condition evaluates to&nbsp;\u003Ccode>false\u003C/code>:\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>Context::when(\r\n    auth()-&gt;user()-&gt;isAdmin(),\r\n    fn($ctx) =&gt; $ctx-&gt;add('is_admin', true),\r\n    fn($ctx) =&gt; $ctx-&gt;add('is_admin', false)\r\n);\u003C/code>\u003C/pre>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">3. Stacks for Breadcrumbs\u003C/h3>\r\n\u003Cdiv class=\"relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg\">\r\n\u003Cdiv class=\"text-text-500 font-small p-3.5 pb-0\">\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Track execution flow\r\nContext::push('breadcrumbs', 'UserController@store');\r\nContext::push('breadcrumbs', 'CreateUserAction');\r\nContext::push('breadcrumbs', 'UserRepository@create');\r\n\r\n// Later retrieve the execution path\r\n$executionPath = Context::get('breadcrumbs');\r\n// ['UserController@store', 'CreateUserAction', 'UserRepository@create']\u003C/code>\u003C/pre>\r\n\u003Cp>We can accomplish a lot by using context as needed. For more details, please refer to the \u003Ca href=\"https://laravel.com/docs/12.x/context\">official documentation\u003C/a> (Laravel 12).\u003C/p>\r\n\u003C/div>\r\n\u003C/div>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Quick Reference\u003C/h2>\r\n\u003Cpre class=\"language-php\">\u003Ccode>// Add data\r\nContext::add('key', 'value');\r\nContext::addHidden('secret', 'value');\r\nContext::addIf('key', 'value'); // Only if not exists\r\n\r\n// Retrieve\r\nContext::get('key');\r\nContext::getHidden('secret');\r\nContext::all();\r\nContext::only(['key1', 'key2']);\r\n\r\n// Check existence\r\nContext::has('key');\r\nContext::missing('key');\r\n\r\n// Remove\r\nContext::forget('key');\r\nContext::pull('key'); // Get and remove\r\n\r\n// Stacks\r\nContext::push('stack', 'value');\r\nContext::pop('stack');\r\nContext::stackContains('stack', 'value');\r\n\r\n// Counters\r\nContext::increment('count');\r\nContext::decrement('count');\u003C/code>\u003C/pre>\r\n\u003Ch2 class=\"text-text-100 mt-3 -mb-1 text-[1.125rem] font-bold\">Conclusion\u003C/h2>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Laravel Context is perfect for:\u003C/p>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Multi-tenant applications (company/tenant IDs)\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Request tracing and debugging\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Passing data to queued jobs automatically\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Reducing repetitive code for cross-cutting concerns\u003C/li>\r\n\u003C/ul>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Start simple with a trace ID or company ID, and expand as you see the benefits!\u003Cbr>\u003Cbr>\u003C/p>\r\n\u003Chr>\r\n\u003Cp style=\"text-align: center;\">\u003Cstrong>Pro Tip:\u003C/strong> Check your logs after implementing Context - you'll be amazed at how much easier debugging becomes when every log entry includes your trace ID and tenant context automatically.\u003Cbr>\u003Cbr>\u003Cstrong>Happy Coding !!\u003C/strong>\u003C/p>","2026-02-01T16:41:10.000000Z","2026-02-01T16:59:42.000000Z",[82],{"name":18,"slug":19},{"id":15,"title":84,"slug":85,"short_description":86,"content":87,"author":11,"is_enabled":12,"created_at":88,"updated_at":88,"reading_time":29,"tags":89,"next_slug":20,"previous_slug":20},"Master Laravel's updateOrCreate() for Smarter Database Operations","master-laravel-s-updateorcreate-for-smarter-database-operations","Stop writing repetitive if-else logic to check if records exist before updating or creating them. Laravel's updateOrCreate() method handles both operations intelligently in a single, elegant call.","\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">The Problem\u003C/h3>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">How many times have you written code like this?\u003Cbr>\u003Cbr>\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$user = User::where('email', $request-&gt;email)-&gt;first();\r\n\r\nif ($user) {\r\n    $user-&gt;update([\r\n        'name' =&gt; $request-&gt;name,\r\n        'phone' =&gt; $request-&gt;phone,\r\n    ]);\r\n} else {\r\n    $user = User::create([\r\n        'email' =&gt; $request-&gt;email,\r\n        'name' =&gt; $request-&gt;name,\r\n        'phone' =&gt; $request-&gt;phone,\r\n    ]);\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">It works, but it's verbose and requires extra queries.\u003C/p>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">The Solution: \u003Ccode class=\"bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">updateOrCreate()\u003C/code>\u003C/h3>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">Laravel provides a cleaner way to handle this pattern:\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>$user = User::updateOrCreate(\r\n    ['email' =&gt; $request-&gt;email],  // Search by this\r\n    [\r\n        'name' =&gt; $request-&gt;name,   // Update or create with this\r\n        'phone' =&gt; $request-&gt;phone,\r\n    ]\r\n);\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>How it works:\u003C/strong>\u003C/p>\r\n\u003Col class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Laravel searches for a record matching the first array (the \"search criteria\")\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">If found, it updates that record with the second array\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">If not found, it creates a new record merging both arrays\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Returns the model instance either way\u003C/li>\r\n\u003C/ol>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">Pro Tips\u003C/h3>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>1. Use with fillable/guarded.\u003C/strong> Make sure your model allows mass assignment for the fields you're updating:\u003C/p>\r\n\u003Cpre class=\"language-php\">\u003Ccode>class User extends Model\r\n{\r\n    protected $fillable = ['email', 'name', 'phone'];\r\n}\u003C/code>\u003C/pre>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">&nbsp;\u003C/p>\r\n\u003Ch3 class=\"text-text-100 mt-2 -mb-1 text-base font-bold\">When to Use It\u003C/h3>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>Perfect for:\u003C/strong>\u003C/p>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">API data synchronization\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Import/export operations\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">User settings and preferences\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Idempotent API endpoints\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Upserting records from external sources\u003C/li>\r\n\u003C/ul>\r\n\u003Cp class=\"font-claude-response-body break-words whitespace-normal leading-[1.7]\">\u003Cstrong>Not ideal for:\u003C/strong>\u003C/p>\r\n\u003Cul class=\"[li_&amp;]:mb-0 [li_&amp;]:mt-1 [li_&amp;]:gap-1 [&amp;:not(:last-child)_ul]:pb-1 [&amp;:not(:last-child)_ol]:pb-1 list-disc flex flex-col gap-1 pl-8 mb-3\">\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">When you need different logic for create vs. update\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">When validation rules differ between operations\u003C/li>\r\n\u003Cli class=\"whitespace-normal break-words pl-2\">Complex conditional updates\u003C/li>\r\n\u003C/ul>","2026-01-31T18:03:17.000000Z",[90],{"name":18,"slug":19},{"current_page":15,"from":15,"last_page":15,"links":92,"path":101,"per_page":102,"to":6,"total":6},[93,96,99],{"url":20,"label":94,"page":20,"active":95},"&laquo; Previous",false,{"url":97,"label":98,"page":15,"active":12},"https://admin.ssbhattarai.com.np/api/v1/tips?page=1","1",{"url":20,"label":100,"page":20,"active":95},"Next &raquo;","https://admin.ssbhattarai.com.np/api/v1/tips",12]