[{"data":1,"prerenderedAt":959},["ShallowReactive",2],{"docs-navigation":3,"doc-\u002Fdev\u002Flaravel\u002Feloquent-relationships":186,"surround-\u002Fdev\u002Flaravel\u002Feloquent-relationships":804,"notes-index":809},[4,62,127,138,149,160,175],{"title":5,"path":6,"stem":7,"children":8},"Dev","\u002Fdev","1.dev",[9,12,26,36,46,52],{"title":10,"path":6,"stem":11},"Development","1.dev\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Laravel","\u002Fdev\u002Flaravel","1.dev\u002F1.laravel\u002Findex",[17,18,22],{"title":13,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Eloquent Relationships","\u002Fdev\u002Flaravel\u002Feloquent-relationships","1.dev\u002F1.laravel\u002F1.eloquent-relationships",{"title":23,"path":24,"stem":25},"Laravel Homestead","\u002Fdev\u002Flaravel\u002Flaravel-homestead","1.dev\u002F1.laravel\u002F2.laravel-homestead",{"title":27,"path":28,"stem":29,"children":30},"Bash","\u002Fdev\u002Fbash","1.dev\u002F13.bash\u002Findex",[31,32],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"My Bash RC","\u002Fdev\u002Fbash\u002Fbash-rc","1.dev\u002F13.bash\u002F2.bash-rc",{"title":37,"path":38,"stem":39,"children":40},"Clean Code","\u002Fdev\u002Fclean-code","1.dev\u002F15.clean-code\u002Findex",[41,42],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Naming Things","\u002Fdev\u002Fclean-code\u002Fnaming-things","1.dev\u002F15.clean-code\u002F1.naming-things",{"title":47,"path":48,"stem":49,"children":50},"AI Prompting","\u002Fdev\u002Fai-prompting","1.dev\u002F17.ai-prompting\u002Findex",[51],{"title":47,"path":48,"stem":49},{"title":53,"path":54,"stem":55,"children":56},"Git","\u002Fdev\u002Fgit","1.dev\u002F9.git\u002Findex",[57,58],{"title":53,"path":54,"stem":55},{"title":59,"path":60,"stem":61},"Git Cheat Sheet","\u002Fdev\u002Fgit\u002Fgit-cheat-sheet","1.dev\u002F9.git\u002F1.git-cheat-sheet",{"title":63,"path":64,"stem":65,"children":66},"Teaching","\u002Fteaching","2.teaching",[67,69],{"title":63,"path":64,"stem":68},"2.teaching\u002Findex",{"title":70,"path":71,"stem":72,"children":73},"AppsDev","\u002Fteaching\u002Fapps-dev","2.teaching\u002F1.apps-dev\u002Findex",[74,75,93,107,117],{"title":70,"path":71,"stem":72},{"title":76,"path":77,"stem":78,"children":79},"Lesson Plans","\u002Fteaching\u002Fapps-dev\u002Flesson-plans","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002Findex",[80,81,85,89],{"title":76,"path":77,"stem":78},{"title":82,"path":83,"stem":84},"Coding with AI","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fcoding-with-ai","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F1.coding-with-ai",{"title":86,"path":87,"stem":88},"Coding with AI: Prompts & Reading JavaScript","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fprompts-and-reading-js","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F2.prompts-and-reading-js",{"title":90,"path":91,"stem":92},"JavaScript for Beginners","\u002Fteaching\u002Fapps-dev\u002Flesson-plans\u002Fjavascript-for-beginners","2.teaching\u002F1.apps-dev\u002F1.lesson-plans\u002F3.javascript-for-beginners",{"title":94,"path":95,"stem":96,"children":97},"Activities","\u002Fteaching\u002Fapps-dev\u002Factivities","2.teaching\u002F1.apps-dev\u002F2.activities\u002Findex",[98,99,103],{"title":94,"path":95,"stem":96},{"title":100,"path":101,"stem":102},"Dynamic Portfolio Website","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fdynamic-portfolio-website","2.teaching\u002F1.apps-dev\u002F2.activities\u002F2.dynamic-portfolio-website",{"title":104,"path":105,"stem":106},"Mini Product Store","\u002Fteaching\u002Fapps-dev\u002Factivities\u002Fmini-product-store","2.teaching\u002F1.apps-dev\u002F2.activities\u002F3.mini-product-store",{"title":108,"path":109,"stem":110,"children":111},"Exercises","\u002Fteaching\u002Fapps-dev\u002Fexercises","2.teaching\u002F1.apps-dev\u002F4.exercises\u002Findex",[112,113],{"title":108,"path":109,"stem":110},{"title":114,"path":115,"stem":116},"Read & Predict","\u002Fteaching\u002Fapps-dev\u002Fexercises\u002Fread-and-predict","2.teaching\u002F1.apps-dev\u002F4.exercises\u002F1.read-and-predict",{"title":118,"path":119,"stem":120,"children":121},"AI Prompts","\u002Fteaching\u002Fapps-dev\u002Fai-prompts","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002Findex",[122,123],{"title":118,"path":119,"stem":120},{"title":124,"path":125,"stem":126},"Prompt Flow","\u002Fteaching\u002Fapps-dev\u002Fai-prompts\u002Fbasic-prompting","2.teaching\u002F1.apps-dev\u002F7.ai-prompts\u002F1.basic-prompting",{"title":128,"path":129,"stem":130,"children":131},"Snippets","\u002Fsnippets","3.snippets",[132,134],{"title":128,"path":129,"stem":133},"3.snippets\u002Findex",{"title":135,"path":136,"stem":137},"Debounce and Throttle","\u002Fsnippets\u002Fdebounce-and-throttle","3.snippets\u002F1.debounce-and-throttle",{"title":139,"path":140,"stem":141,"children":142},"Cheat Sheets","\u002Fcheat-sheets","4.cheat-sheets",[143,145],{"title":139,"path":140,"stem":144},"4.cheat-sheets\u002Findex",{"title":146,"path":147,"stem":148},"Vim Cheat Sheet","\u002Fcheat-sheets\u002Fvim-cheat-sheet","4.cheat-sheets\u002F1.vim-cheat-sheet",{"title":150,"path":151,"stem":152,"children":153},"Templates","\u002Ftemplates","5.templates",[154,156],{"title":150,"path":151,"stem":155},"5.templates\u002Findex",{"title":157,"path":158,"stem":159},"Pull Request Template","\u002Ftemplates\u002Fpull-request-template","5.templates\u002F1.pull-request-template",{"title":161,"path":162,"stem":163,"children":164},"Meta","\u002Fmeta","6.meta",[165,167,171],{"title":161,"path":162,"stem":166},"6.meta\u002Findex",{"title":168,"path":169,"stem":170},"Authoring Guide","\u002Fmeta\u002Fauthoring-guide","6.meta\u002F1.authoring-guide",{"title":172,"path":173,"stem":174},"Markdown Showcase","\u002Fmeta\u002Fmarkdown-showcase","6.meta\u002F2.markdown-showcase",{"title":176,"path":177,"stem":178,"children":179},"Troubleshooting","\u002Ftroubleshooting","7.troubleshooting",[180,182],{"title":176,"path":177,"stem":181},"7.troubleshooting\u002Findex",{"title":183,"path":184,"stem":185},"Fixing CORS Errors","\u002Ftroubleshooting\u002Fcors-errors","7.troubleshooting\u002F1.cors-errors",{"id":187,"title":19,"body":188,"category":13,"createdAt":788,"description":789,"draft":790,"extension":791,"featured":790,"keywords":792,"links":795,"meta":796,"navigation":317,"path":20,"readingTime":218,"seo":797,"stem":21,"tags":798,"updatedAt":788,"__hash__":803},"docs\u002F1.dev\u002F1.laravel\u002F1.eloquent-relationships.md",{"type":189,"value":190,"toc":783},"minimark",[191,195,200,523,527,538,666,670,673,769,779],[192,193,194],"p",{},"Eloquent relationships map database foreign keys to expressive PHP methods. Get\nthe direction right and most data access reads like plain English.",[196,197,199],"h2",{"id":198},"the-common-relationships","The common relationships",[201,202,203,388,456],"code-group",{},[204,205,211],"pre",{"className":206,"code":207,"filename":208,"language":209,"meta":210,"style":210},"language-php shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","class Post extends Model\n{\n    public function comments()\n    {\n        return $this->hasMany(Comment::class);\n    }\n}\n\nclass Comment extends Model\n{\n    public function post()\n    {\n        return $this->belongsTo(Post::class);\n    }\n}\n","One to many","php","",[212,213,214,234,241,257,263,300,306,312,319,331,336,348,353,378,383],"code",{"__ignoreMap":210},[215,216,219,223,227,230],"span",{"class":217,"line":218},"line",1,[215,220,222],{"class":221},"s5Kfy","class",[215,224,226],{"class":225},"sD-vU"," Post",[215,228,229],{"class":221}," extends",[215,231,233],{"class":232},"sYn-s"," Model\n",[215,235,237],{"class":217,"line":236},2,[215,238,240],{"class":239},"soVBu","{\n",[215,242,244,247,250,254],{"class":217,"line":243},3,[215,245,246],{"class":221},"    public",[215,248,249],{"class":221}," function",[215,251,253],{"class":252},"sljsM"," comments",[215,255,256],{"class":239},"()\n",[215,258,260],{"class":217,"line":259},4,[215,261,262],{"class":239},"    {\n",[215,264,266,270,273,277,281,284,287,291,294,297],{"class":217,"line":265},5,[215,267,269],{"class":268},"siDh9","        return",[215,271,272],{"class":239}," $",[215,274,276],{"class":275},"sETVe","this",[215,278,280],{"class":279},"sVsLi","->",[215,282,283],{"class":252},"hasMany",[215,285,286],{"class":239},"(",[215,288,290],{"class":289},"sa2tF","Comment",[215,292,293],{"class":279},"::",[215,295,222],{"class":296},"scgAs",[215,298,299],{"class":239},");\n",[215,301,303],{"class":217,"line":302},6,[215,304,305],{"class":239},"    }\n",[215,307,309],{"class":217,"line":308},7,[215,310,311],{"class":239},"}\n",[215,313,315],{"class":217,"line":314},8,[215,316,318],{"emptyLinePlaceholder":317},true,"\n",[215,320,322,324,327,329],{"class":217,"line":321},9,[215,323,222],{"class":221},[215,325,326],{"class":225}," Comment",[215,328,229],{"class":221},[215,330,233],{"class":232},[215,332,334],{"class":217,"line":333},10,[215,335,240],{"class":239},[215,337,339,341,343,346],{"class":217,"line":338},11,[215,340,246],{"class":221},[215,342,249],{"class":221},[215,344,345],{"class":252}," post",[215,347,256],{"class":239},[215,349,351],{"class":217,"line":350},12,[215,352,262],{"class":239},[215,354,356,358,360,362,364,367,369,372,374,376],{"class":217,"line":355},13,[215,357,269],{"class":268},[215,359,272],{"class":239},[215,361,276],{"class":275},[215,363,280],{"class":279},[215,365,366],{"class":252},"belongsTo",[215,368,286],{"class":239},[215,370,371],{"class":289},"Post",[215,373,293],{"class":279},[215,375,222],{"class":296},[215,377,299],{"class":239},[215,379,381],{"class":217,"line":380},14,[215,382,305],{"class":239},[215,384,386],{"class":217,"line":385},15,[215,387,311],{"class":239},[204,389,392],{"className":206,"code":390,"filename":391,"language":209,"meta":210,"style":210},"class User extends Model\n{\n    public function roles()\n    {\n        return $this->belongsToMany(Role::class);\n    }\n}\n","Many to many",[212,393,394,405,409,420,424,448,452],{"__ignoreMap":210},[215,395,396,398,401,403],{"class":217,"line":218},[215,397,222],{"class":221},[215,399,400],{"class":225}," User",[215,402,229],{"class":221},[215,404,233],{"class":232},[215,406,407],{"class":217,"line":236},[215,408,240],{"class":239},[215,410,411,413,415,418],{"class":217,"line":243},[215,412,246],{"class":221},[215,414,249],{"class":221},[215,416,417],{"class":252}," roles",[215,419,256],{"class":239},[215,421,422],{"class":217,"line":259},[215,423,262],{"class":239},[215,425,426,428,430,432,434,437,439,442,444,446],{"class":217,"line":265},[215,427,269],{"class":268},[215,429,272],{"class":239},[215,431,276],{"class":275},[215,433,280],{"class":279},[215,435,436],{"class":252},"belongsToMany",[215,438,286],{"class":239},[215,440,441],{"class":289},"Role",[215,443,293],{"class":279},[215,445,222],{"class":296},[215,447,299],{"class":239},[215,449,450],{"class":217,"line":302},[215,451,305],{"class":239},[215,453,454],{"class":217,"line":308},[215,455,311],{"class":239},[204,457,460],{"className":206,"code":458,"filename":459,"language":209,"meta":210,"style":210},"class User extends Model\n{\n    public function profile()\n    {\n        return $this->hasOne(Profile::class);\n    }\n}\n","Has one",[212,461,462,472,476,487,491,515,519],{"__ignoreMap":210},[215,463,464,466,468,470],{"class":217,"line":218},[215,465,222],{"class":221},[215,467,400],{"class":225},[215,469,229],{"class":221},[215,471,233],{"class":232},[215,473,474],{"class":217,"line":236},[215,475,240],{"class":239},[215,477,478,480,482,485],{"class":217,"line":243},[215,479,246],{"class":221},[215,481,249],{"class":221},[215,483,484],{"class":252}," profile",[215,486,256],{"class":239},[215,488,489],{"class":217,"line":259},[215,490,262],{"class":239},[215,492,493,495,497,499,501,504,506,509,511,513],{"class":217,"line":265},[215,494,269],{"class":268},[215,496,272],{"class":239},[215,498,276],{"class":275},[215,500,280],{"class":279},[215,502,503],{"class":252},"hasOne",[215,505,286],{"class":239},[215,507,508],{"class":289},"Profile",[215,510,293],{"class":279},[215,512,222],{"class":296},[215,514,299],{"class":239},[215,516,517],{"class":217,"line":302},[215,518,305],{"class":239},[215,520,521],{"class":217,"line":308},[215,522,311],{"class":239},[196,524,526],{"id":525},"the-n1-problem","The N+1 problem",[528,529,530],"warning",{},[192,531,532,533,537],{},"Accessing a relationship inside a loop fires one query ",[534,535,536],"strong",{},"per row",". A list of 50\nposts that each read their author is 51 queries.",[204,539,541],{"className":206,"code":540,"language":209,"meta":210,"style":210},"\u002F\u002F Bad: 1 query for posts, then 1 per post for the author\n$posts = Post::all();\nforeach ($posts as $post) {\n    echo $post->author->name;\n}\n\n\u002F\u002F Good: 2 queries total, thanks to eager loading\n$posts = Post::with('author')->get();\n",[212,542,543,549,571,595,618,622,626,631],{"__ignoreMap":210},[215,544,545],{"class":217,"line":218},[215,546,548],{"class":547},"s9Tkl","\u002F\u002F Bad: 1 query for posts, then 1 per post for the author\n",[215,550,551,554,558,561,563,565,568],{"class":217,"line":236},[215,552,553],{"class":239},"$",[215,555,557],{"class":556},"sSC40","posts",[215,559,560],{"class":239}," =",[215,562,226],{"class":289},[215,564,293],{"class":279},[215,566,567],{"class":252},"all",[215,569,570],{"class":239},"();\n",[215,572,573,576,579,581,584,586,589,592],{"class":217,"line":243},[215,574,575],{"class":268},"foreach",[215,577,578],{"class":239}," ($",[215,580,557],{"class":556},[215,582,583],{"class":279}," as",[215,585,272],{"class":239},[215,587,588],{"class":556},"post",[215,590,591],{"class":239},")",[215,593,594],{"class":239}," {\n",[215,596,597,601,603,605,607,610,612,615],{"class":217,"line":259},[215,598,600],{"class":599},"sJdAF","    echo",[215,602,272],{"class":239},[215,604,588],{"class":556},[215,606,280],{"class":279},[215,608,609],{"class":556},"author",[215,611,280],{"class":279},[215,613,614],{"class":556},"name",[215,616,617],{"class":239},";\n",[215,619,620],{"class":217,"line":265},[215,621,311],{"class":239},[215,623,624],{"class":217,"line":302},[215,625,318],{"emptyLinePlaceholder":317},[215,627,628],{"class":217,"line":308},[215,629,630],{"class":547},"\u002F\u002F Good: 2 queries total, thanks to eager loading\n",[215,632,633,635,637,639,641,643,646,648,652,655,657,659,661,664],{"class":217,"line":314},[215,634,553],{"class":239},[215,636,557],{"class":556},[215,638,560],{"class":239},[215,640,226],{"class":289},[215,642,293],{"class":279},[215,644,645],{"class":252},"with",[215,647,286],{"class":239},[215,649,651],{"class":650},"sbYkP","'",[215,653,609],{"class":654},"sTbE_",[215,656,651],{"class":650},[215,658,591],{"class":239},[215,660,280],{"class":279},[215,662,663],{"class":252},"get",[215,665,570],{"class":239},[196,667,669],{"id":668},"catch-it-early","Catch it early",[192,671,672],{},"Tell Eloquent to throw when a relationship is lazy-loaded, so N+1 bugs surface in\ndevelopment instead of production:",[204,674,677],{"className":206,"code":675,"filename":676,"language":209,"meta":210,"style":210},"use Illuminate\\Database\\Eloquent\\Model;\n\npublic function boot(): void\n{\n    Model::preventLazyLoading(! $this->app->isProduction());\n}\n","app\u002FProviders\u002FAppServiceProvider.php",[212,678,679,706,710,729,733,765],{"__ignoreMap":210},[215,680,681,684,688,691,694,696,699,701,704],{"class":217,"line":218},[215,682,683],{"class":296},"use",[215,685,687],{"class":686},"s131V"," Illuminate",[215,689,690],{"class":239},"\\",[215,692,693],{"class":686},"Database",[215,695,690],{"class":239},[215,697,698],{"class":686},"Eloquent",[215,700,690],{"class":239},[215,702,703],{"class":686},"Model",[215,705,617],{"class":239},[215,707,708],{"class":217,"line":236},[215,709,318],{"emptyLinePlaceholder":317},[215,711,712,715,717,720,723,726],{"class":217,"line":243},[215,713,714],{"class":221},"public",[215,716,249],{"class":221},[215,718,719],{"class":252}," boot",[215,721,722],{"class":239},"()",[215,724,725],{"class":279},":",[215,727,728],{"class":296}," void\n",[215,730,731],{"class":217,"line":259},[215,732,240],{"class":239},[215,734,735,738,740,743,745,748,750,752,754,757,759,762],{"class":217,"line":265},[215,736,737],{"class":289},"    Model",[215,739,293],{"class":279},[215,741,742],{"class":252},"preventLazyLoading",[215,744,286],{"class":239},[215,746,747],{"class":279},"!",[215,749,272],{"class":239},[215,751,276],{"class":275},[215,753,280],{"class":279},[215,755,756],{"class":556},"app",[215,758,280],{"class":279},[215,760,761],{"class":252},"isProduction",[215,763,764],{"class":239},"());\n",[215,766,767],{"class":217,"line":302},[215,768,311],{"class":239},[770,771,772],"tip",{},[192,773,774,775,778],{},"Constrain eager loads to only the columns you need:\n",[212,776,777],{},"Post::with('author:id,name')->get()",".",[780,781,782],"style",{},"html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sETVe, html code.shiki .sETVe{--shiki-light:#39ADB5;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .scgAs, html code.shiki .scgAs{--shiki-light:#F76D47;--shiki-default:#1E754F;--shiki-dark:#4D9375}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}",{"title":210,"searchDepth":243,"depth":243,"links":784},[785,786,787],{"id":198,"depth":236,"text":199},{"id":525,"depth":236,"text":526},{"id":668,"depth":236,"text":669},"2026-07-17","The core Eloquent relationship types with examples and the N+1 trap to avoid.",false,"md",[283,366,436,793,645,794],"eager loading","n+1",[],{},{"title":19,"description":789},[799,800,801,802],"laravel","eloquent","database","orm","nhioCkizBR2qM_2DWBptjhS2cOHXu9Alg3uY8nBWDA0",[805,807],{"title":13,"path":14,"stem":15,"description":806,"children":-1},"The PHP framework for web artisans — Eloquent, routing, queues and more.",{"title":23,"path":24,"stem":25,"description":808,"children":-1},"My quick reference for setting up and using Laravel Homestead during development.",[810,812,817,819,825,828,835,838,841,848,851,854,861,865,870,873,881,885,888,894,897,901,904,907,909,915,918,923,926,932,935,942,947,950,956],{"path":20,"title":19,"description":789,"tags":811,"category":13,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},[799,800,801,802],{"path":24,"title":23,"description":808,"tags":813,"category":13,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},[799,814,815,816],"homestead","vagrant","virtualbox",{"path":14,"title":13,"description":806,"tags":818,"category":13,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},[],{"path":34,"title":33,"description":820,"tags":821,"category":27,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":236,"draft":790},"Personal Bash aliases and helper functions that streamline my Laravel and Homestead development workflow.",[822,823,824,814,799],"bash","bashrc","git bash",{"path":28,"title":27,"description":826,"tags":827,"category":27,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Shell scripting and a faster life on the command line.",[],{"path":44,"title":43,"description":829,"tags":830,"category":37,"featured":317,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Practical rules for naming variables, functions and types so code reads like prose.",[831,832,833,834],"clean-code","naming","readability","craft",{"path":38,"title":37,"description":836,"tags":837,"category":37,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Writing code that other people (and future you) can read.",[],{"path":48,"title":47,"description":839,"tags":840,"category":47,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Getting reliable, useful results out of language models.",[],{"path":60,"title":59,"description":842,"tags":843,"category":53,"featured":317,"updatedAt":788,"createdAt":788,"readingTime":236,"draft":790},"The Git commands I actually use day to day, plus how to undo things safely.",[844,845,846,847],"git","cli","version-control","cheat-sheet",{"path":54,"title":53,"description":849,"tags":850,"category":53,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Version control — everyday commands and getting out of trouble.",[],{"path":6,"title":10,"description":852,"tags":853,"category":10,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Languages, frameworks and the craft of building software.",[],{"path":83,"title":82,"description":855,"tags":856,"category":63,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":259,"draft":790},"An introduction to AI-assisted software development, modern development workflows, and the mindset needed to use AI responsibly throughout the course.",[857,858,859,860],"ai","software development","prompt engineering","beginners",{"path":87,"title":86,"description":862,"tags":863,"category":63,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":259,"draft":790},"Learn how to write effective AI prompts and read JavaScript code confidently. This lesson teaches students how to direct AI instead of blindly copying its output.",[857,864,859,860],"javascript",{"path":91,"title":90,"description":866,"tags":867,"category":63,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":243,"draft":790},"Introduction to the fundamentals of JavaScript, from variables and functions to loops, DOM manipulation, and events. This lesson prepares students for the Mini Product Store activity.",[864,860,868,869],"programming","web development",{"path":77,"title":76,"description":871,"tags":872,"category":76,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Session-by-session plans with objectives, timing and materials.",[],{"path":101,"title":100,"description":874,"tags":875,"category":94,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":243,"draft":790},"Build a personal portfolio website using JavaScript arrays, loops, and DOM manipulation instead of hardcoded HTML.",[876,877,864,878,879,880],"teaching","activity","portfolio","dom","loops",{"path":105,"title":104,"description":882,"tags":883,"category":94,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":243,"draft":790},"A JavaScript activity where students build a simple product store using arrays, loops, functions, DOM manipulation, and event listeners.",[876,877,864,879,884,880],"arrays",{"path":95,"title":94,"description":886,"tags":887,"category":94,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"In-class activities that get students doing, not just listening.",[],{"path":115,"title":114,"description":889,"tags":890,"category":94,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":236,"draft":790},"Practice reading JavaScript code, predicting its output, and verifying your understanding before running the program.",[876,877,864,891,892,893],"functions","if-statement","debugging",{"path":109,"title":108,"description":895,"tags":896,"category":108,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Practice problems that build skill through repetition.",[],{"path":125,"title":124,"description":898,"tags":899,"category":118,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":259,"draft":790},"A structured workflow for working with AI that emphasizes planning, review, and understanding before implementation.",[857,859,900],"workflow",{"path":119,"title":118,"description":902,"tags":903,"category":118,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Prompt templates for teaching with and about AI.",[],{"path":71,"title":70,"description":905,"tags":906,"category":63,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Lesson plans, activities, rubrics and student references.",[],{"path":64,"title":63,"description":905,"tags":908,"category":63,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},[],{"path":136,"title":135,"description":910,"tags":911,"category":128,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Two tiny functions to control how often a handler runs — with the difference explained.",[864,912,913,914],"performance","snippets","events",{"path":129,"title":128,"description":916,"tags":917,"category":128,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Small, copy-ready fragments you reach for again and again.",[],{"path":147,"title":146,"description":919,"tags":920,"category":139,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"The essential Vim motions and commands to get productive and get out.",[921,922,847,845],"vim","editor",{"path":140,"title":139,"description":924,"tags":925,"category":139,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Dense, scannable references for commands and syntax.",[],{"path":158,"title":157,"description":927,"tags":928,"category":150,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"A reusable PR description template that makes reviews faster and kinder.",[844,929,930,931],"github","template","collaboration",{"path":151,"title":150,"description":933,"tags":934,"category":150,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Reusable starting points for files, configs and docs.",[],{"path":169,"title":168,"description":936,"tags":937,"category":161,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":236,"draft":790},"The frontmatter and markdown conventions every note in this knowledge base follows.",[938,939,940,941],"meta","conventions","markdown","authoring",{"path":173,"title":172,"description":943,"tags":944,"category":161,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":236,"draft":790},"Every formatting feature this knowledge base supports, on one page — a living reference and rendering test.",[940,945,946],"mdc","reference",{"path":162,"title":161,"description":948,"tags":949,"category":161,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"How this knowledge base itself is built and maintained.",[],{"path":184,"title":183,"description":951,"tags":952,"category":176,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"What a CORS error actually means and how to fix it — on the server, where it belongs.",[953,954,955,893],"cors","http","apis",{"path":177,"title":176,"description":957,"tags":958,"category":176,"featured":790,"updatedAt":788,"createdAt":788,"readingTime":218,"draft":790},"Symptoms, causes and fixes for problems worth remembering.",[],1784276795578]