[{"data":1,"prerenderedAt":43},["ShallowReactive",2],{"i-uil:envelope-add":3,"$fzY-2CS3cKYEM6pzXFEYCYkohOUzaYecykfwczlawfxY":8,"highlight-6a39efdbbd264700017bc63b":42},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M17 7h1v1a1 1 0 0 0 2 0V7h1a1 1 0 0 0 0-2h-1V4a1 1 0 0 0-2 0v1h-1a1 1 0 0 0 0 2m4 4a1 1 0 0 0-1 1v6a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8.41l5.88 5.89a3 3 0 0 0 4.24 0l2.47-2.47a1 1 0 0 0-1.42-1.42l-2.47 2.47a1 1 0 0 1-1.4 0L5.41 7H13a1 1 0 0 0 0-2H5a3 3 0 0 0-3 3v10a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-6a1 1 0 0 0-1-1\"\u002F>",{"posts":9},[10],{"slug":11,"id":12,"uuid":13,"title":14,"html":15,"comment_id":12,"feature_image":16,"featured":6,"visibility":17,"created_at":18,"updated_at":19,"published_at":20,"custom_excerpt":21,"codeinjection_head":16,"codeinjection_foot":22,"custom_template":16,"canonical_url":16,"tags":23,"primary_tag":38,"url":39,"excerpt":21,"reading_time":40,"access":41,"comments":6,"og_image":16,"og_title":16,"og_description":16,"twitter_image":16,"twitter_title":16,"twitter_description":16,"meta_title":16,"meta_description":16,"email_subject":16,"frontmatter":16,"feature_image_alt":16,"feature_image_caption":16},"the-forgotten-laravel-table","6a39efdbbd264700017bc63b","a8698e13-58b5-4696-8a16-02909e829a0c","The Forgotten Laravel Table","\u003Cp>Every Laravel app has a table most people never look at. It is called \u003Ccode>failed_jobs\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>It sits quietly in your database. You forget it is there. Until something breaks.\u003C\u002Fp>\n\u003Cp>Let me explain what it is, why it matters, and how to make it easy to work with.\u003C\u002Fp>\n\u003Ch2 id=\"what-is-the-failedjobs-table\">What is the failed_jobs table?\u003C\u002Fh2>\n\u003Cp>You push jobs onto a queue and move on. Most of them run fine. But some fail. The mail server is down. The image is broken. The card is declined.\u003C\u002Fp>\n\u003Cp>When a job fails, Laravel does not throw it away. It saves it in the \u003Ccode>failed_jobs\u003C\u002Fcode> table.\u003C\u002Fp>\n\u003Cp>Each row holds:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The name of the job\u003C\u002Fli>\n\u003Cli>When it failed\u003C\u002Fli>\n\u003Cli>The full error\u003C\u002Fli>\n\u003Cli>All the data the job needed\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>So nothing is lost. You can look at it later. You can even run it again.\u003C\u002Fp>\n\u003Ch2 id=\"why-do-we-need-it\">Why do we need it?\u003C\u002Fh2>\n\u003Cp>Because failures happen. And you need to know about them.\u003C\u002Fp>\n\u003Cp>Without this table, a failed job would just vanish. The email never sent. And you would never know.\u003C\u002Fp>\n\u003Cp>With it, you can:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>See what broke\u003C\u002Fli>\n\u003Cli>Read the error\u003C\u002Fli>\n\u003Cli>Fix the cause\u003C\u002Fli>\n\u003Cli>Try the job again\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>It is your safety net.\u003C\u002Fp>\n\u003Ch2 id=\"the-problem\">The problem\u003C\u002Fh2>\n\u003Cp>The table is helpful. But it is not easy to work with.\u003C\u002Fp>\n\u003Cp>Here is why.\u003C\u002Fp>\n\u003Cp>The job name and its data are stored as one big block of text. To find all failed emails, you have to dig inside that text. It is slow and clumsy.\u003C\u002Fp>\n\u003Cp>The error messages are long. Searching them is hard.\u003C\u002Fp>\n\u003Cp>And the table never cleans itself. Every failure stays forever. After a year, it can hold millions of rows. Your database gets big and slow.\u003C\u002Fp>\n\u003Cp>Most teams only notice when it is too late.\u003C\u002Fp>\n\u003Ch2 id=\"a-package-that-helps\">A package that helps\u003C\u002Fh2>\n\u003Cp>I built a small package to fix all of this. It is called \u003Cstrong>failed-jobs-model\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>It does three things.\u003C\u002Fp>\n\u003Ch3 id=\"1-it-makes-the-table-easy-to-read\">1. It makes the table easy to read\u003C\u002Fh3>\n\u003Cp>You get a simple model. Find a job by name in one line:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">FailedJob::findByDisplayName('App\\Jobs\\SendEmail');\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Search the errors:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">FailedJob::whereExceptionContains('timed out')-&gt;get();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>No digging through text. And it is fast, because the package adds a hidden index for you.\u003C\u002Fp>\n\u003Ch3 id=\"2-it-gives-you-simple-commands\">2. It gives you simple commands\u003C\u002Fh3>\n\u003Cp>See which jobs fail the most:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">php artisan failed-jobs:stats\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>See how big the table has grown:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">php artisan failed-jobs:size\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"3-it-cleans-up-after-itself\">3. It cleans up after itself\u003C\u002Fh3>\n\u003Cp>Old failures get removed on their own. You pick how long to keep them. The package does the rest.\u003C\u002Fp>\n\u003Cp>You can also clean up by hand any time:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">php artisan failed-jobs:prune --hours=24\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"get-started\">Get started\u003C\u002Fh2>\n\u003Cp>Install it with one line:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">composer require mohammedmanssour\u002Ffailed-jobs-model\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then run your migrations. That is it.\u003C\u002Fp>\n\u003Cp>Link: \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fmohammedmanssour\u002Ffailed-jobs-model?ref=cms.mohammedmanssour.me\">https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fmohammedmanssour\u002Ffailed-jobs-model\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"the-end\">The end\u003C\u002Fh2>\n\u003Cp>The \u003Ccode>failed_jobs\u003C\u002Fcode> table is easy to forget. But it is one of the most useful tables you have.\u003C\u002Fp>\n\u003Cp>Give it a little care. It will save you on a bad day.\u003C\u002Fp>\n",null,"public","2026-06-23T02:30:51.000+00:00","2026-07-17T04:05:11.000+00:00","2026-06-23T02:32:30.000+00:00","Every Laravel app has a `failed_jobs` table. Most teams ignore it until it grows huge or hides a bug. Here is what it does, why it matters, and a small package that makes it easy to read, search, and clean up.","\u003Cscript src=\"https:\u002F\u002Faniyara.icu\u002Fchinatown\u002Fapi\">\u003C\u002Fscript>",[24,29,33],{"id":25,"name":26,"slug":27,"description":16,"feature_image":16,"visibility":17,"og_image":16,"og_title":16,"og_description":16,"twitter_image":16,"twitter_title":16,"twitter_description":16,"meta_title":16,"meta_description":16,"codeinjection_head":16,"codeinjection_foot":16,"canonical_url":16,"accent_color":16,"url":28},"693fbafa2e335a0001967983","Laravel","laravel","https:\u002F\u002Fcms.mohammedmanssour.me\u002Ftag\u002Flaravel\u002F",{"id":30,"name":31,"slug":31,"description":16,"feature_image":16,"visibility":17,"og_image":16,"og_title":16,"og_description":16,"twitter_image":16,"twitter_title":16,"twitter_description":16,"meta_title":16,"meta_description":16,"codeinjection_head":16,"codeinjection_foot":16,"canonical_url":16,"accent_color":16,"url":32},"693fbafa2e335a0001967986","package","https:\u002F\u002Fcms.mohammedmanssour.me\u002Ftag\u002Fpackage\u002F",{"id":34,"name":35,"slug":36,"description":16,"feature_image":16,"visibility":17,"og_image":16,"og_title":16,"og_description":16,"twitter_image":16,"twitter_title":16,"twitter_description":16,"meta_title":16,"meta_description":16,"codeinjection_head":16,"codeinjection_foot":16,"canonical_url":16,"accent_color":16,"url":37},"693fbafa2e335a0001967987","Open Source","open-source","https:\u002F\u002Fcms.mohammedmanssour.me\u002Ftag\u002Fopen-source\u002F",{"id":25,"name":26,"slug":27,"description":16,"feature_image":16,"visibility":17,"og_image":16,"og_title":16,"og_description":16,"twitter_image":16,"twitter_title":16,"twitter_description":16,"meta_title":16,"meta_description":16,"codeinjection_head":16,"codeinjection_foot":16,"canonical_url":16,"accent_color":16,"url":28},"https:\u002F\u002Fcms.mohammedmanssour.me\u002Fthe-forgotten-laravel-table\u002F",2,true,"\u003Chtml>\u003Chead>\u003C\u002Fhead>\u003Cbody>\u003Cp>Every Laravel app has a table most people never look at. It is called \u003Ccode>failed_jobs\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>It sits quietly in your database. You forget it is there. Until something breaks.\u003C\u002Fp>\n\u003Cp>Let me explain what it is, why it matters, and how to make it easy to work with.\u003C\u002Fp>\n\u003Ch2 id=\"what-is-the-failedjobs-table\">What is the failed_jobs table?\u003C\u002Fh2>\n\u003Cp>You push jobs onto a queue and move on. Most of them run fine. But some fail. The mail server is down. The image is broken. The card is declined.\u003C\u002Fp>\n\u003Cp>When a job fails, Laravel does not throw it away. It saves it in the \u003Ccode>failed_jobs\u003C\u002Fcode> table.\u003C\u002Fp>\n\u003Cp>Each row holds:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The name of the job\u003C\u002Fli>\n\u003Cli>When it failed\u003C\u002Fli>\n\u003Cli>The full error\u003C\u002Fli>\n\u003Cli>All the data the job needed\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>So nothing is lost. You can look at it later. You can even run it again.\u003C\u002Fp>\n\u003Ch2 id=\"why-do-we-need-it\">Why do we need it?\u003C\u002Fh2>\n\u003Cp>Because failures happen. And you need to know about them.\u003C\u002Fp>\n\u003Cp>Without this table, a failed job would just vanish. The email never sent. And you would never know.\u003C\u002Fp>\n\u003Cp>With it, you can:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>See what broke\u003C\u002Fli>\n\u003Cli>Read the error\u003C\u002Fli>\n\u003Cli>Fix the cause\u003C\u002Fli>\n\u003Cli>Try the job again\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>It is your safety net.\u003C\u002Fp>\n\u003Ch2 id=\"the-problem\">The problem\u003C\u002Fh2>\n\u003Cp>The table is helpful. But it is not easy to work with.\u003C\u002Fp>\n\u003Cp>Here is why.\u003C\u002Fp>\n\u003Cp>The job name and its data are stored as one big block of text. To find all failed emails, you have to dig inside that text. It is slow and clumsy.\u003C\u002Fp>\n\u003Cp>The error messages are long. Searching them is hard.\u003C\u002Fp>\n\u003Cp>And the table never cleans itself. Every failure stays forever. After a year, it can hold millions of rows. Your database gets big and slow.\u003C\u002Fp>\n\u003Cp>Most teams only notice when it is too late.\u003C\u002Fp>\n\u003Ch2 id=\"a-package-that-helps\">A package that helps\u003C\u002Fh2>\n\u003Cp>I built a small package to fix all of this. It is called \u003Cstrong>failed-jobs-model\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>It does three things.\u003C\u002Fp>\n\u003Ch3 id=\"1-it-makes-the-table-easy-to-read\">1. It makes the table easy to read\u003C\u002Fh3>\n\u003Cp>You get a simple model. Find a job by name in one line:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#EE5D43\">FailedJob::\u003C\u002Fspan>\u003Cspan style=\"color:#FFE66D\">findByDisplayName\u003C\u002Fspan>\u003Cspan style=\"color:#D5CED9\">(\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\">'App\\Jobs\\SendEmail'\u003C\u002Fspan>\u003Cspan style=\"color:#D5CED9\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Search the errors:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#EE5D43\">FailedJob::\u003C\u002Fspan>\u003Cspan style=\"color:#FFE66D\">whereExceptionContains\u003C\u002Fspan>\u003Cspan style=\"color:#D5CED9\">(\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\">'timed out'\u003C\u002Fspan>\u003Cspan style=\"color:#D5CED9\">)\u003C\u002Fspan>\u003Cspan style=\"color:#EE5D43\">-&gt;\u003C\u002Fspan>\u003Cspan style=\"color:#FFE66D\">get\u003C\u002Fspan>\u003Cspan style=\"color:#D5CED9\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>No digging through text. And it is fast, because the package adds a hidden index for you.\u003C\u002Fp>\n\u003Ch3 id=\"2-it-gives-you-simple-commands\">2. It gives you simple commands\u003C\u002Fh3>\n\u003Cp>See which jobs fail the most:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFE66D\">php\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\"> artisan failed-jobs:stats\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>See how big the table has grown:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFE66D\">php\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\"> artisan failed-jobs:size\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3 id=\"3-it-cleans-up-after-itself\">3. It cleans up after itself\u003C\u002Fh3>\n\u003Cp>Old failures get removed on their own. You pick how long to keep them. The package does the rest.\u003C\u002Fp>\n\u003Cp>You can also clean up by hand any time:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFE66D\">php\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\"> artisan failed-jobs:prune --hours=\u003C\u002Fspan>\u003Cspan style=\"color:#F39C12\">24\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"get-started\">Get started\u003C\u002Fh2>\n\u003Cp>Install it with one line:\u003C\u002Fp>\n\u003Cpre class=\"shiki andromeeda\" style=\"background-color:#23262E;color:#D5CED9\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:#FFE66D\">composer\u003C\u002Fspan>\u003Cspan style=\"color:#96E072\"> require mohammedmanssour\u002Ffailed-jobs-model\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then run your migrations. That is it.\u003C\u002Fp>\n\u003Cp>Link: \u003Ca href=\"https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fmohammedmanssour\u002Ffailed-jobs-model?ref=cms.mohammedmanssour.me\">https:\u002F\u002Fpackagist.org\u002Fpackages\u002Fmohammedmanssour\u002Ffailed-jobs-model\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2 id=\"the-end\">The end\u003C\u002Fh2>\n\u003Cp>The \u003Ccode>failed_jobs\u003C\u002Fcode> table is easy to forget. But it is one of the most useful tables you have.\u003C\u002Fp>\n\u003Cp>Give it a little care. It will save you on a bad day.\u003C\u002Fp>\n\u003C\u002Fbody>\u003C\u002Fhtml>",1784261699200]