[{"data":1,"prerenderedAt":6535},["ShallowReactive",2],{"navigation":3,"/essentials/orm":283,"/essentials/orm-surround":6530},[4,16,20,68,128,168,179,259,263,267,271,275,279],{"title":5,"path":6,"stem":7,"children":8},"Getting Started","/getting-started","1.getting-started",[9,12],{"title":10,"path":6,"stem":11},"Introduction","1.getting-started/index",{"title":13,"path":14,"stem":15},"Installation","/getting-started/installation","1.getting-started/1.installation",{"title":17,"path":18,"stem":19},"Upgrading","/upgrading","10.upgrading",{"title":21,"path":22,"stem":23,"children":24},"Essentials","/essentials","2.essentials",[25,28,32,36,40,44,48,52,56,60,64],{"title":26,"path":22,"stem":27},"Core concepts","2.essentials/index",{"title":29,"path":30,"stem":31},"Routing","/essentials/routing","2.essentials/1.routing",{"title":33,"path":34,"stem":35},"Typed Requests & Responses","/essentials/typed-io","2.essentials/10.typed-io",{"title":37,"path":38,"stem":39},"Authentication","/essentials/authentication","2.essentials/2.authentication",{"title":41,"path":42,"stem":43},"Identity & User Store","/essentials/identity","2.essentials/3.identity",{"title":45,"path":46,"stem":47},"Requests & Responses","/essentials/requests-responses","2.essentials/4.requests-responses",{"title":49,"path":50,"stem":51},"Controllers","/essentials/controllers","2.essentials/5.controllers",{"title":53,"path":54,"stem":55},"Database","/essentials/database","2.essentials/6.database",{"title":57,"path":58,"stem":59},"Validation","/essentials/validation","2.essentials/7.validation",{"title":61,"path":62,"stem":63},"Migrations","/essentials/migrations","2.essentials/8.migrations",{"title":65,"path":66,"stem":67},"ORM Models","/essentials/orm","2.essentials/9.orm",{"title":69,"path":70,"stem":71,"children":72},"Features","/features","3.features",[73,76,80,84,88,92,96,100,104,108,112,116,120,124],{"title":74,"path":70,"stem":75},"Built‑in Capabilities","3.features/index",{"title":77,"path":78,"stem":79},"API Keys & Scopes","/features/api-keys","3.features/api-keys",{"title":81,"path":82,"stem":83},"Browser Sessions (Cookie Auth)","/features/browser-sessions","3.features/browser-sessions",{"title":85,"path":86,"stem":87},"Caching","/features/caching","3.features/caching",{"title":89,"path":90,"stem":91},"CORS & CSRF","/features/cors-csrf","3.features/cors-csrf",{"title":93,"path":94,"stem":95},"Distributed Locks","/features/distributed-locks","3.features/distributed-locks",{"title":97,"path":98,"stem":99},"Events & Listeners","/features/events","3.features/events",{"title":101,"path":102,"stem":103},"Field Selection","/features/field-selection","3.features/field-selection",{"title":105,"path":106,"stem":107},"File Uploads","/features/file-uploads","3.features/file-uploads",{"title":109,"path":110,"stem":111},"Notifications","/features/notifications","3.features/notifications",{"title":113,"path":114,"stem":115},"Queues & Jobs","/features/queues-jobs","3.features/queues-jobs",{"title":117,"path":118,"stem":119},"Rate Limiting","/features/rate-limiting","3.features/rate-limiting",{"title":121,"path":122,"stem":123},"Task Scheduling","/features/scheduling","3.features/scheduling",{"title":125,"path":126,"stem":127},"Webhooks","/features/webhooks","3.features/webhooks",{"title":129,"path":130,"stem":131,"children":132},"Advanced","/advanced","4.advanced",[133,136,140,144,148,152,156,160,164],{"title":134,"path":130,"stem":135},"Techniques and Patterns","4.advanced/index",{"title":137,"path":138,"stem":139},"Configuration","/advanced/configuration","4.advanced/configuration",{"title":141,"path":142,"stem":143},"Dependency Injection","/advanced/dependency-injection","4.advanced/dependency-injection",{"title":145,"path":146,"stem":147},"Middleware","/advanced/middleware","4.advanced/middleware",{"title":149,"path":150,"stem":151},"OpenAPI Generation","/advanced/openapi","4.advanced/openapi",{"title":153,"path":154,"stem":155},"Performance","/advanced/performance","4.advanced/performance",{"title":157,"path":158,"stem":159},"Repositories","/advanced/repositories","4.advanced/repositories",{"title":161,"path":162,"stem":163},"Service Providers","/advanced/service-providers","4.advanced/service-providers",{"title":165,"path":166,"stem":167},"Testing","/advanced/testing","4.advanced/testing",{"title":169,"path":170,"stem":171,"children":172},"Overview","/tooling","5.tooling",[173,175],{"title":169,"path":170,"stem":174},"5.tooling/index",{"title":176,"path":177,"stem":178},"AI Skills","/tooling/ai-skills","5.tooling/1.ai-skills",{"title":180,"path":181,"stem":182,"children":183},"Cookbook","/cookbook","6.cookbook",[184,187,191,195,199,203,207,211,215,219,223,227,231,235,239,243,247,251,255],{"title":185,"path":181,"stem":186},"Recipes & How‑Tos","6.cookbook/index",{"title":188,"path":189,"stem":190},"Routing Recipes","/cookbook/routing","6.cookbook/1.routing",{"title":192,"path":193,"stem":194},"Caching Recipes","/cookbook/caching","6.cookbook/10.caching",{"title":196,"path":197,"stem":198},"Queue Infrastructure","/cookbook/queues-and-jobs","6.cookbook/11.queues-and-jobs",{"title":200,"path":201,"stem":202},"Notification Channels & Templates","/cookbook/notifications","6.cookbook/13.notifications",{"title":204,"path":205,"stem":206},"Storage","/cookbook/storage","6.cookbook/15.storage",{"title":208,"path":209,"stem":210},"Image Processing Examples","/cookbook/image-processing","6.cookbook/16.image-processing",{"title":212,"path":213,"stem":214},"Permissions and Authorization","/cookbook/permissions-and-authorization","6.cookbook/18.permissions-and-authorization",{"title":216,"path":217,"stem":218},"Session Analytics","/cookbook/sessions-analytics","6.cookbook/19.sessions-analytics",{"title":220,"path":221,"stem":222},"Writing Middleware","/cookbook/middleware","6.cookbook/2.middleware",{"title":224,"path":225,"stem":226},"API Metrics","/cookbook/api-metrics","6.cookbook/20.api-metrics",{"title":228,"path":229,"stem":230},"Performance Recipes","/cookbook/performance","6.cookbook/21.performance",{"title":232,"path":233,"stem":234},"Memory Management","/cookbook/memory-management","6.cookbook/22.memory-management",{"title":236,"path":237,"stem":238},"Writing Console Commands","/cookbook/console-commands","6.cookbook/23.console-commands",{"title":240,"path":241,"stem":242},"Glueful Extensions","/cookbook/extensions","6.cookbook/25.extensions",{"title":244,"path":245,"stem":246},"Error Handling","/cookbook/error-handling","6.cookbook/4.error-handling",{"title":248,"path":249,"stem":250},"Security Guide","/cookbook/security","6.cookbook/5.security",{"title":252,"path":253,"stem":254},"Service Options Resolver","/cookbook/configuration","6.cookbook/6.configuration",{"title":256,"path":257,"stem":258},"Logging","/cookbook/logging","6.cookbook/7.logging",{"title":260,"path":261,"stem":262},"API Reference","/api-reference","7.api-reference",{"title":264,"path":265,"stem":266},"CLI Reference","/cli-reference","8.cli-reference",{"title":268,"path":269,"stem":270},"Extensions","/extensions","9.extensions",{"title":272,"path":273,"stem":274},"Contributing","/contributing","contributing",{"title":276,"path":277,"stem":278},"Release Notes","/releases","releases",{"title":280,"path":281,"stem":282},"Release Archive","/releases-archive","releases-archive",{"id":284,"title":65,"body":285,"description":6522,"extension":6523,"links":6524,"meta":6525,"navigation":589,"path":66,"seo":6526,"stem":67,"__hash__":6529},"docs/2.essentials/9.orm.md",{"type":286,"value":287,"toc":6499},"minimark",[288,306,318,546,556,561,910,1095,1118,1121,1240,1245,1279,1283,1295,1336,1339,1434,1438,1441,1548,1555,1810,1835,1861,1874,1878,1885,2054,2070,2074,2116,2484,2523,2533,2537,2557,2687,2718,2739,2743,3307,3321,3325,3340,3535,3542,3670,3686,3690,3703,4032,4096,4111,4114,4252,4255,4414,4444,4448,4728,4744,4748,4754,5044,5047,5165,5181,5293,5304,5308,5322,5333,5403,5539,5542,5589,5592,5690,5700,5704,5715,5944,5960,6126,6130,6201,6206,6358,6397,6435,6441,6445,6469,6473,6495],[289,290,291,292,296,297,300,301,305],"p",{},"Glueful ships an active-record ORM in ",[293,294,295],"code",{},"Glueful\\Database\\ORM",". A model is a class that extends ",[293,298,299],{},"Glueful\\Database\\ORM\\Model"," and maps to one table. Under the hood every model query runs through the same ",[302,303,304],"a",{"href":54},"query builder",", so typed exceptions, soft deletes and connection handling behave identically.",[289,307,308,309,317],{},"The one rule to remember: ",[310,311,312,313,316],"strong",{},"every static entry point takes the ",[293,314,315],{},"ApplicationContext"," first."," That is how the model finds its database connection.",[319,320,325],"pre",{"className":321,"code":322,"language":323,"meta":324,"style":324},"language-php shiki shiki-themes material-theme-lighter github-light github-dark monokai","$post  = Post::find($context, 42);\n$posts = Post::query($context)->where('status', 'published')->get();\n$post  = Post::create($context, ['title' => 'Hello', 'body' => '...']);\n$draft = new Post(['title' => 'Draft'], $context);   // context is the 2nd constructor argument\n","php","",[293,326,327,371,434,497],{"__ignoreMap":324},[328,329,332,336,340,344,348,351,355,358,361,364,368],"span",{"class":330,"line":331},"line",1,[328,333,335],{"class":334},"swvn1","$",[328,337,339],{"class":338},"ss--_","post  ",[328,341,343],{"class":342},"sGXK2","=",[328,345,347],{"class":346},"s_MOj"," Post",[328,349,350],{"class":342},"::",[328,352,354],{"class":353},"sD0ED","find",[328,356,357],{"class":334},"($",[328,359,360],{"class":338},"context",[328,362,363],{"class":334},",",[328,365,367],{"class":366},"sYThS"," 42",[328,369,370],{"class":334},");\n",[328,372,374,376,379,381,383,385,388,390,392,395,398,401,404,408,412,414,416,419,422,424,426,428,431],{"class":330,"line":373},2,[328,375,335],{"class":334},[328,377,378],{"class":338},"posts ",[328,380,343],{"class":342},[328,382,347],{"class":346},[328,384,350],{"class":342},[328,386,387],{"class":353},"query",[328,389,357],{"class":334},[328,391,360],{"class":338},[328,393,394],{"class":334},")",[328,396,397],{"class":342},"->",[328,399,400],{"class":353},"where",[328,402,403],{"class":334},"(",[328,405,407],{"class":406},"siCPE","'",[328,409,411],{"class":410},"sLACW","status",[328,413,407],{"class":406},[328,415,363],{"class":334},[328,417,418],{"class":406}," '",[328,420,421],{"class":410},"published",[328,423,407],{"class":406},[328,425,394],{"class":334},[328,427,397],{"class":342},[328,429,430],{"class":353},"get",[328,432,433],{"class":334},"();\n",[328,435,437,439,441,443,445,447,450,452,454,456,459,461,464,466,469,471,474,476,478,480,483,485,487,489,492,494],{"class":330,"line":436},3,[328,438,335],{"class":334},[328,440,339],{"class":338},[328,442,343],{"class":342},[328,444,347],{"class":346},[328,446,350],{"class":342},[328,448,449],{"class":353},"create",[328,451,357],{"class":334},[328,453,360],{"class":338},[328,455,363],{"class":334},[328,457,458],{"class":334}," [",[328,460,407],{"class":406},[328,462,463],{"class":410},"title",[328,465,407],{"class":406},[328,467,468],{"class":342}," =>",[328,470,418],{"class":406},[328,472,473],{"class":410},"Hello",[328,475,407],{"class":406},[328,477,363],{"class":334},[328,479,418],{"class":406},[328,481,482],{"class":410},"body",[328,484,407],{"class":406},[328,486,468],{"class":342},[328,488,418],{"class":406},[328,490,491],{"class":410},"...",[328,493,407],{"class":406},[328,495,496],{"class":334},"]);\n",[328,498,500,502,505,507,511,513,516,518,520,522,524,526,529,531,534,537,539,542],{"class":330,"line":499},4,[328,501,335],{"class":334},[328,503,504],{"class":338},"draft ",[328,506,343],{"class":342},[328,508,510],{"class":509},"shWJe"," new",[328,512,347],{"class":346},[328,514,515],{"class":334},"([",[328,517,407],{"class":406},[328,519,463],{"class":410},[328,521,407],{"class":406},[328,523,468],{"class":342},[328,525,418],{"class":406},[328,527,528],{"class":410},"Draft",[328,530,407],{"class":406},[328,532,533],{"class":334},"],",[328,535,536],{"class":334}," $",[328,538,360],{"class":338},[328,540,541],{"class":334},");",[328,543,545],{"class":544},"ss7Ak","   // context is the 2nd constructor argument\n",[289,547,548,549,552,553,555],{},"Inside a controller the context is ",[293,550,551],{},"$this->context","; in a service, inject ",[293,554,315],{},".",[557,558,560],"h2",{"id":559},"defining-a-model","Defining a Model",[319,562,564],{"className":321,"code":563,"language":323,"meta":324,"style":324},"namespace App\\Models;\n\nuse Glueful\\Database\\ORM\\Model;\n\nclass Post extends Model\n{\n    protected string $table = 'posts';\n    protected string $primaryKey = 'id';\n\n    protected array $fillable = ['user_id', 'title', 'body', 'status', 'meta'];\n\n    protected array $hidden = ['internal_notes'];\n\n    protected array $casts = [\n        'user_id'    => 'int',\n        'meta'       => 'array',\n        'created_at' => 'datetime',\n        'updated_at' => 'datetime',   // optional: read them back as DateTimeImmutable\n    ];\n}\n",[293,565,566,585,591,618,622,639,645,670,693,698,758,763,788,793,810,833,854,875,898,904],{"__ignoreMap":324},[328,567,568,571,575,579,582],{"class":330,"line":331},[328,569,570],{"class":509},"namespace",[328,572,574],{"class":573},"sKvfc"," App",[328,576,578],{"class":577},"sANao","\\",[328,580,581],{"class":573},"Models",[328,583,584],{"class":334},";\n",[328,586,587],{"class":330,"line":373},[328,588,590],{"emptyLinePlaceholder":589},true,"\n",[328,592,593,596,600,603,605,607,610,612,616],{"class":330,"line":436},[328,594,595],{"class":509},"use",[328,597,599],{"class":598},"s91G_"," Glueful",[328,601,578],{"class":602},"sv8o3",[328,604,53],{"class":598},[328,606,578],{"class":602},[328,608,609],{"class":598},"ORM",[328,611,578],{"class":602},[328,613,615],{"class":614},"seZir","Model",[328,617,584],{"class":334},[328,619,620],{"class":330,"line":499},[328,621,590],{"emptyLinePlaceholder":589},[328,623,625,629,631,635],{"class":330,"line":624},5,[328,626,628],{"class":627},"srJo8","class",[328,630,347],{"class":573},[328,632,634],{"class":633},"sTNss"," extends",[328,636,638],{"class":637},"sW3Pz"," Model\n",[328,640,642],{"class":330,"line":641},6,[328,643,644],{"class":334},"{\n",[328,646,648,651,654,656,659,661,663,666,668],{"class":330,"line":647},7,[328,649,650],{"class":633},"    protected",[328,652,653],{"class":509}," string",[328,655,536],{"class":334},[328,657,658],{"class":338},"table ",[328,660,343],{"class":342},[328,662,418],{"class":406},[328,664,665],{"class":410},"posts",[328,667,407],{"class":406},[328,669,584],{"class":334},[328,671,673,675,677,679,682,684,686,689,691],{"class":330,"line":672},8,[328,674,650],{"class":633},[328,676,653],{"class":509},[328,678,536],{"class":334},[328,680,681],{"class":338},"primaryKey ",[328,683,343],{"class":342},[328,685,418],{"class":406},[328,687,688],{"class":410},"id",[328,690,407],{"class":406},[328,692,584],{"class":334},[328,694,696],{"class":330,"line":695},9,[328,697,590],{"emptyLinePlaceholder":589},[328,699,701,703,706,708,711,713,715,717,720,722,724,726,728,730,732,734,736,738,740,742,744,746,748,750,753,755],{"class":330,"line":700},10,[328,702,650],{"class":633},[328,704,705],{"class":509}," array",[328,707,536],{"class":334},[328,709,710],{"class":338},"fillable ",[328,712,343],{"class":342},[328,714,458],{"class":334},[328,716,407],{"class":406},[328,718,719],{"class":410},"user_id",[328,721,407],{"class":406},[328,723,363],{"class":334},[328,725,418],{"class":406},[328,727,463],{"class":410},[328,729,407],{"class":406},[328,731,363],{"class":334},[328,733,418],{"class":406},[328,735,482],{"class":410},[328,737,407],{"class":406},[328,739,363],{"class":334},[328,741,418],{"class":406},[328,743,411],{"class":410},[328,745,407],{"class":406},[328,747,363],{"class":334},[328,749,418],{"class":406},[328,751,752],{"class":410},"meta",[328,754,407],{"class":406},[328,756,757],{"class":334},"];\n",[328,759,761],{"class":330,"line":760},11,[328,762,590],{"emptyLinePlaceholder":589},[328,764,766,768,770,772,775,777,779,781,784,786],{"class":330,"line":765},12,[328,767,650],{"class":633},[328,769,705],{"class":509},[328,771,536],{"class":334},[328,773,774],{"class":338},"hidden ",[328,776,343],{"class":342},[328,778,458],{"class":334},[328,780,407],{"class":406},[328,782,783],{"class":410},"internal_notes",[328,785,407],{"class":406},[328,787,757],{"class":334},[328,789,791],{"class":330,"line":790},13,[328,792,590],{"emptyLinePlaceholder":589},[328,794,796,798,800,802,805,807],{"class":330,"line":795},14,[328,797,650],{"class":633},[328,799,705],{"class":509},[328,801,536],{"class":334},[328,803,804],{"class":338},"casts ",[328,806,343],{"class":342},[328,808,809],{"class":334}," [\n",[328,811,813,816,818,820,823,825,828,830],{"class":330,"line":812},15,[328,814,815],{"class":406},"        '",[328,817,719],{"class":410},[328,819,407],{"class":406},[328,821,822],{"class":342},"    =>",[328,824,418],{"class":406},[328,826,827],{"class":410},"int",[328,829,407],{"class":406},[328,831,832],{"class":334},",\n",[328,834,836,838,840,842,845,847,850,852],{"class":330,"line":835},16,[328,837,815],{"class":406},[328,839,752],{"class":410},[328,841,407],{"class":406},[328,843,844],{"class":342},"       =>",[328,846,418],{"class":406},[328,848,849],{"class":410},"array",[328,851,407],{"class":406},[328,853,832],{"class":334},[328,855,857,859,862,864,866,868,871,873],{"class":330,"line":856},17,[328,858,815],{"class":406},[328,860,861],{"class":410},"created_at",[328,863,407],{"class":406},[328,865,468],{"class":342},[328,867,418],{"class":406},[328,869,870],{"class":410},"datetime",[328,872,407],{"class":406},[328,874,832],{"class":334},[328,876,878,880,883,885,887,889,891,893,895],{"class":330,"line":877},18,[328,879,815],{"class":406},[328,881,882],{"class":410},"updated_at",[328,884,407],{"class":406},[328,886,468],{"class":342},[328,888,418],{"class":406},[328,890,870],{"class":410},[328,892,407],{"class":406},[328,894,363],{"class":334},[328,896,897],{"class":544},"   // optional: read them back as DateTimeImmutable\n",[328,899,901],{"class":330,"line":900},19,[328,902,903],{"class":334},"    ];\n",[328,905,907],{"class":330,"line":906},20,[328,908,909],{"class":334},"}\n",[911,912,913,929],"table",{},[914,915,916],"thead",{},[917,918,919,923,926],"tr",{},[920,921,922],"th",{},"Property",[920,924,925],{},"Default",[920,927,928],{},"Purpose",[930,931,932,953,968,987,1003,1022,1043,1064,1080],"tbody",{},[917,933,934,940,950],{},[935,936,937],"td",{},[293,938,939],{},"$table",[935,941,942,943,946,947,394],{},"snake_case plural of the class name (",[293,944,945],{},"OrderItem"," → ",[293,948,949],{},"order_items",[935,951,952],{},"Table name",[917,954,955,960,965],{},[935,956,957],{},[293,958,959],{},"$primaryKey",[935,961,962],{},[293,963,964],{},"'id'",[935,966,967],{},"Primary key column",[917,969,970,975,980],{},[935,971,972],{},[293,973,974],{},"$keyType",[935,976,977],{},[293,978,979],{},"'int'",[935,981,982,983,986],{},"Key type; set ",[293,984,985],{},"'string'"," for UUID keys",[917,988,989,995,1000],{},[935,990,991,994],{},[293,992,993],{},"$incrementing"," (public)",[935,996,997],{},[293,998,999],{},"true",[935,1001,1002],{},"Read the generated id back after insert",[917,1004,1005,1010,1014],{},[935,1006,1007,994],{},[293,1008,1009],{},"$timestamps",[935,1011,1012],{},[293,1013,999],{},[935,1015,1016,1017,1019,1020],{},"Maintain ",[293,1018,861],{}," / ",[293,1021,882],{},[917,1023,1024,1032,1040],{},[935,1025,1026,1019,1029],{},[293,1027,1028],{},"$fillable",[293,1030,1031],{},"$guarded",[935,1033,1034,1019,1037],{},[293,1035,1036],{},"[]",[293,1038,1039],{},"['*']",[935,1041,1042],{},"Mass-assignment rules",[917,1044,1045,1053,1057],{},[935,1046,1047,1019,1050],{},[293,1048,1049],{},"$hidden",[293,1051,1052],{},"$visible",[935,1054,1055],{},[293,1056,1036],{},[935,1058,1059,1060,1063],{},"Filter ",[293,1061,1062],{},"toArray()"," / JSON output",[917,1065,1066,1071,1075],{},[935,1067,1068],{},[293,1069,1070],{},"$appends",[935,1072,1073],{},[293,1074,1036],{},[935,1076,1077,1078],{},"Accessor values added to ",[293,1079,1062],{},[917,1081,1082,1087,1092],{},[935,1083,1084],{},[293,1085,1086],{},"$perPage",[935,1088,1089],{},[293,1090,1091],{},"15",[935,1093,1094],{},"Default page size",[289,1096,1097,1099,1100,1102,1103,1106,1107,1109,1110,1113,1114,1117],{},[293,1098,993],{}," and ",[293,1101,1009],{}," are ",[310,1104,1105],{},"public"," properties on the base class, so redeclare them as ",[293,1108,1105],{}," (",[293,1111,1112],{},"public bool $timestamps = false;","). A ",[293,1115,1116],{},"protected"," redeclaration is a fatal error.",[289,1119,1120],{},"For a string key you generate yourself:",[319,1122,1124],{"className":321,"code":1123,"language":323,"meta":324,"style":324},"class ApiClient extends Model\n{\n    protected string $primaryKey = 'uuid';\n    protected string $keyType = 'string';\n    public bool $incrementing = false;\n    protected array $fillable = ['uuid', 'name'];\n}\n",[293,1125,1126,1137,1141,1162,1184,1205,1236],{"__ignoreMap":324},[328,1127,1128,1130,1133,1135],{"class":330,"line":331},[328,1129,628],{"class":627},[328,1131,1132],{"class":573}," ApiClient",[328,1134,634],{"class":633},[328,1136,638],{"class":637},[328,1138,1139],{"class":330,"line":373},[328,1140,644],{"class":334},[328,1142,1143,1145,1147,1149,1151,1153,1155,1158,1160],{"class":330,"line":436},[328,1144,650],{"class":633},[328,1146,653],{"class":509},[328,1148,536],{"class":334},[328,1150,681],{"class":338},[328,1152,343],{"class":342},[328,1154,418],{"class":406},[328,1156,1157],{"class":410},"uuid",[328,1159,407],{"class":406},[328,1161,584],{"class":334},[328,1163,1164,1166,1168,1170,1173,1175,1177,1180,1182],{"class":330,"line":499},[328,1165,650],{"class":633},[328,1167,653],{"class":509},[328,1169,536],{"class":334},[328,1171,1172],{"class":338},"keyType ",[328,1174,343],{"class":342},[328,1176,418],{"class":406},[328,1178,1179],{"class":410},"string",[328,1181,407],{"class":406},[328,1183,584],{"class":334},[328,1185,1186,1189,1192,1194,1197,1199,1203],{"class":330,"line":624},[328,1187,1188],{"class":633},"    public",[328,1190,1191],{"class":509}," bool",[328,1193,536],{"class":334},[328,1195,1196],{"class":338},"incrementing ",[328,1198,343],{"class":342},[328,1200,1202],{"class":1201},"sMTiH"," false",[328,1204,584],{"class":334},[328,1206,1207,1209,1211,1213,1215,1217,1219,1221,1223,1225,1227,1229,1232,1234],{"class":330,"line":641},[328,1208,650],{"class":633},[328,1210,705],{"class":509},[328,1212,536],{"class":334},[328,1214,710],{"class":338},[328,1216,343],{"class":342},[328,1218,458],{"class":334},[328,1220,407],{"class":406},[328,1222,1157],{"class":410},[328,1224,407],{"class":406},[328,1226,363],{"class":334},[328,1228,418],{"class":406},[328,1230,1231],{"class":410},"name",[328,1233,407],{"class":406},[328,1235,757],{"class":334},[328,1237,1238],{"class":330,"line":647},[328,1239,909],{"class":334},[1241,1242,1244],"h3",{"id":1243},"timestamps","Timestamps",[289,1246,1247,1248,1251,1252,1255,1256,1258,1259,1261,1262,1265,1266,1268,1269,1272,1273,1276,1277,555],{},"With ",[293,1249,1250],{},"$timestamps = true",", ",[293,1253,1254],{},"save()"," sets ",[293,1257,882],{}," on every write and ",[293,1260,861],{}," on insert, formatted with the model's date format (",[293,1263,1264],{},"Y-m-d H:i:s","). No cast is required; add a ",[293,1267,870],{}," cast (as above) to read them back as ",[293,1270,1271],{},"DateTimeImmutable",". Any other ",[293,1274,1275],{},"DateTimeInterface"," you assign to an attribute is formatted the same way on save. If the table has no timestamp columns, set ",[293,1278,1112],{},[1241,1280,1282],{"id":1281},"mass-assignment","Mass Assignment",[289,1284,1285,1251,1288,1251,1291,1294],{},[293,1286,1287],{},"fill()",[293,1289,1290],{},"create()",[293,1292,1293],{},"update()"," and the constructor respect the mass-assignment rules:",[1296,1297,1298,1308,1326],"ul",{},[1299,1300,1301,1302,1251,1304,1307],"li",{},"With a non-empty ",[293,1303,1028],{},[310,1305,1306],{},"only listed keys are kept",". Other keys are silently dropped.",[1299,1309,1310,1311,1313,1314,1317,1318,1321,1322,1325],{},"With an empty ",[293,1312,1028],{}," and the default ",[293,1315,1316],{},"$guarded = ['*']",", any key throws ",[293,1319,1320],{},"InvalidArgumentException"," (\"Add ",[328,1323,1324],{},"x"," to fillable property…\").",[1299,1327,1328,1329,1332,1333,1335],{},"Set ",[293,1330,1331],{},"$guarded = []"," (and leave ",[293,1334,1028],{}," empty) to allow every column.",[289,1337,1338],{},"To bypass the rules deliberately:",[319,1340,1342],{"className":321,"code":1341,"language":323,"meta":324,"style":324},"$post->forceFill(['status' => 'published', 'reviewed_by' => $userId]);\n\nPost::unguarded(fn () => Post::create($context, $trustedRow));\n",[293,1343,1344,1390,1394],{"__ignoreMap":324},[328,1345,1346,1348,1351,1353,1356,1358,1360,1362,1364,1366,1368,1370,1372,1374,1376,1379,1381,1383,1385,1388],{"class":330,"line":331},[328,1347,335],{"class":334},[328,1349,1350],{"class":338},"post",[328,1352,397],{"class":342},[328,1354,1355],{"class":353},"forceFill",[328,1357,515],{"class":334},[328,1359,407],{"class":406},[328,1361,411],{"class":410},[328,1363,407],{"class":406},[328,1365,468],{"class":342},[328,1367,418],{"class":406},[328,1369,421],{"class":410},[328,1371,407],{"class":406},[328,1373,363],{"class":334},[328,1375,418],{"class":406},[328,1377,1378],{"class":410},"reviewed_by",[328,1380,407],{"class":406},[328,1382,468],{"class":342},[328,1384,536],{"class":334},[328,1386,1387],{"class":338},"userId",[328,1389,496],{"class":334},[328,1391,1392],{"class":330,"line":373},[328,1393,590],{"emptyLinePlaceholder":589},[328,1395,1396,1399,1401,1404,1406,1409,1412,1414,1416,1418,1420,1422,1424,1426,1428,1431],{"class":330,"line":436},[328,1397,1398],{"class":346},"Post",[328,1400,350],{"class":342},[328,1402,1403],{"class":353},"unguarded",[328,1405,403],{"class":334},[328,1407,1408],{"class":627},"fn",[328,1410,1411],{"class":334}," ()",[328,1413,468],{"class":334},[328,1415,347],{"class":346},[328,1417,350],{"class":342},[328,1419,449],{"class":353},[328,1421,357],{"class":334},[328,1423,360],{"class":338},[328,1425,363],{"class":334},[328,1427,536],{"class":334},[328,1429,1430],{"class":338},"trustedRow",[328,1432,1433],{"class":334},"));\n",[557,1435,1437],{"id":1436},"casts","Casts",[289,1439,1440],{},"Casts convert values when you read an attribute and again when you write it.",[911,1442,1443,1456],{},[914,1444,1445],{},[917,1446,1447,1450,1453],{},[920,1448,1449],{},"Cast",[920,1451,1452],{},"Read as",[920,1454,1455],{},"Written as",[930,1457,1458,1490,1505,1519,1536],{},[917,1459,1460,1484,1487],{},[935,1461,1462,1019,1464,1251,1467,1019,1470,1019,1473,1251,1476,1251,1478,1019,1481],{},[293,1463,827],{},[293,1465,1466],{},"integer",[293,1468,1469],{},"float",[293,1471,1472],{},"double",[293,1474,1475],{},"real",[293,1477,1179],{},[293,1479,1480],{},"bool",[293,1482,1483],{},"boolean",[935,1485,1486],{},"PHP scalar",[935,1488,1489],{},"as given",[917,1491,1492,1499,1502],{},[935,1493,1494,1019,1496],{},[293,1495,849],{},[293,1497,1498],{},"json",[935,1500,1501],{},"decoded array",[935,1503,1504],{},"JSON string",[917,1506,1507,1512,1517],{},[935,1508,1509],{},[293,1510,1511],{},"object",[935,1513,1514],{},[293,1515,1516],{},"stdClass",[935,1518,1504],{},[917,1520,1521,1528,1532],{},[935,1522,1523,1019,1525],{},[293,1524,870],{},[293,1526,1527],{},"date",[935,1529,1530],{},[293,1531,1271],{},[935,1533,1534,653],{},[293,1535,1264],{},[917,1537,1538,1543,1546],{},[935,1539,1540],{},[293,1541,1542],{},"timestamp",[935,1544,1545],{},"Unix integer",[935,1547,1489],{},[289,1549,1550,1551,1554],{},"Class-based casts live in ",[293,1552,1553],{},"Glueful\\Database\\ORM\\Casts",". Pass constructor arguments after a colon:",[319,1556,1558],{"className":321,"code":1557,"language":323,"meta":324,"style":324},"use App\\Enums\\PostStatus;\nuse Glueful\\Database\\ORM\\Casts\\{AsArrayObject, AsCollection, AsDateTime, AsEncryptedString, AsEnum, AsJson};\n\nprotected array $casts = [\n    'status'       => AsEnum::class . ':' . PostStatus::class,   // backed enum \u003C-> its value\n    'published_on' => AsDateTime::class . ':Y-m-d',             // custom storage format\n    'settings'     => AsArrayObject::class,\n    'tags'         => AsCollection::class,\n    'payload'      => AsJson::class,\n    'ssn'          => AsEncryptedString::class,                 // AES-256-GCM under APP_KEY\n];\n",[293,1559,1560,1578,1632,1636,1650,1691,1722,1743,1763,1783,1806],{"__ignoreMap":324},[328,1561,1562,1564,1566,1568,1571,1573,1576],{"class":330,"line":331},[328,1563,595],{"class":509},[328,1565,574],{"class":598},[328,1567,578],{"class":602},[328,1569,1570],{"class":598},"Enums",[328,1572,578],{"class":602},[328,1574,1575],{"class":614},"PostStatus",[328,1577,584],{"class":334},[328,1579,1580,1582,1584,1586,1588,1590,1592,1594,1596,1598,1601,1604,1606,1609,1611,1614,1616,1619,1621,1624,1626,1629],{"class":330,"line":373},[328,1581,595],{"class":509},[328,1583,599],{"class":598},[328,1585,578],{"class":602},[328,1587,53],{"class":598},[328,1589,578],{"class":602},[328,1591,609],{"class":598},[328,1593,578],{"class":602},[328,1595,1437],{"class":598},[328,1597,578],{"class":602},[328,1599,1600],{"class":334},"{",[328,1602,1603],{"class":614},"AsArrayObject",[328,1605,363],{"class":334},[328,1607,1608],{"class":614}," AsCollection",[328,1610,363],{"class":334},[328,1612,1613],{"class":614}," AsDateTime",[328,1615,363],{"class":334},[328,1617,1618],{"class":614}," AsEncryptedString",[328,1620,363],{"class":334},[328,1622,1623],{"class":614}," AsEnum",[328,1625,363],{"class":334},[328,1627,1628],{"class":614}," AsJson",[328,1630,1631],{"class":334},"};\n",[328,1633,1634],{"class":330,"line":436},[328,1635,590],{"emptyLinePlaceholder":589},[328,1637,1638,1640,1642,1644,1646,1648],{"class":330,"line":499},[328,1639,1116],{"class":633},[328,1641,705],{"class":509},[328,1643,536],{"class":334},[328,1645,804],{"class":338},[328,1647,343],{"class":342},[328,1649,809],{"class":334},[328,1651,1652,1655,1657,1659,1661,1663,1665,1667,1670,1672,1675,1677,1679,1682,1684,1686,1688],{"class":330,"line":624},[328,1653,1654],{"class":406},"    '",[328,1656,411],{"class":410},[328,1658,407],{"class":406},[328,1660,844],{"class":342},[328,1662,1623],{"class":346},[328,1664,350],{"class":342},[328,1666,628],{"class":509},[328,1668,1669],{"class":342}," .",[328,1671,418],{"class":406},[328,1673,1674],{"class":410},":",[328,1676,407],{"class":406},[328,1678,1669],{"class":342},[328,1680,1681],{"class":346}," PostStatus",[328,1683,350],{"class":342},[328,1685,628],{"class":509},[328,1687,363],{"class":334},[328,1689,1690],{"class":544},"   // backed enum \u003C-> its value\n",[328,1692,1693,1695,1698,1700,1702,1704,1706,1708,1710,1712,1715,1717,1719],{"class":330,"line":641},[328,1694,1654],{"class":406},[328,1696,1697],{"class":410},"published_on",[328,1699,407],{"class":406},[328,1701,468],{"class":342},[328,1703,1613],{"class":346},[328,1705,350],{"class":342},[328,1707,628],{"class":509},[328,1709,1669],{"class":342},[328,1711,418],{"class":406},[328,1713,1714],{"class":410},":Y-m-d",[328,1716,407],{"class":406},[328,1718,363],{"class":334},[328,1720,1721],{"class":544},"             // custom storage format\n",[328,1723,1724,1726,1729,1731,1734,1737,1739,1741],{"class":330,"line":647},[328,1725,1654],{"class":406},[328,1727,1728],{"class":410},"settings",[328,1730,407],{"class":406},[328,1732,1733],{"class":342},"     =>",[328,1735,1736],{"class":346}," AsArrayObject",[328,1738,350],{"class":342},[328,1740,628],{"class":509},[328,1742,832],{"class":334},[328,1744,1745,1747,1750,1752,1755,1757,1759,1761],{"class":330,"line":672},[328,1746,1654],{"class":406},[328,1748,1749],{"class":410},"tags",[328,1751,407],{"class":406},[328,1753,1754],{"class":342},"         =>",[328,1756,1608],{"class":346},[328,1758,350],{"class":342},[328,1760,628],{"class":509},[328,1762,832],{"class":334},[328,1764,1765,1767,1770,1772,1775,1777,1779,1781],{"class":330,"line":695},[328,1766,1654],{"class":406},[328,1768,1769],{"class":410},"payload",[328,1771,407],{"class":406},[328,1773,1774],{"class":342},"      =>",[328,1776,1628],{"class":346},[328,1778,350],{"class":342},[328,1780,628],{"class":509},[328,1782,832],{"class":334},[328,1784,1785,1787,1790,1792,1795,1797,1799,1801,1803],{"class":330,"line":700},[328,1786,1654],{"class":406},[328,1788,1789],{"class":410},"ssn",[328,1791,407],{"class":406},[328,1793,1794],{"class":342},"          =>",[328,1796,1618],{"class":346},[328,1798,350],{"class":342},[328,1800,628],{"class":509},[328,1802,363],{"class":334},[328,1804,1805],{"class":544},"                 // AES-256-GCM under APP_KEY\n",[328,1807,1808],{"class":330,"line":760},[328,1809,757],{"class":334},[289,1811,1812,1815,1816,1819,1820,1823,1824,1827,1828,1251,1831,1834],{},[293,1813,1814],{},"AsEncryptedString"," encrypts through the framework ",[293,1817,1818],{},"EncryptionService"," with ",[293,1821,1822],{},"\u003Ctable>.\u003Ccolumn>"," as additional authenticated data, so ",[293,1825,1826],{},"php glueful encryption:rotate --table=... --columns=..."," can re-key it. It resolves the service from the model's context, so build such models with one (",[293,1829,1830],{},"new User([...], $context)",[293,1832,1833],{},"User::create($context, ...)",").",[1836,1837,1841],"u-alert",{"color":1838,"icon":1839,"variant":1840},"info","i-tabler-info-circle","subtle",[1842,1843,1844],"template",{"v-slot:description":324},[289,1845,1846,1849,1850,1853,1854,1857,1858,1860],{},[310,1847,1848],{},"Since 1.91:"," the cast used AES-256-CBC under ",[293,1851,1852],{},"ENCRYPTION_KEY",". Set ",[293,1855,1856],{},"APP_KEY",", and keep ",[293,1859,1852],{}," until every old value has been re-saved: legacy values still decrypt and are re-encrypted with GCM on their next save.",[289,1862,1863,1864,1109,1867,1099,1870,1873],{},"Write your own by implementing ",[293,1865,1866],{},"Glueful\\Database\\ORM\\Contracts\\CastsAttributes",[293,1868,1869],{},"get()",[293,1871,1872],{},"set()",", each receiving the model, key, value and raw attributes).",[1241,1875,1877],{"id":1876},"accessors-and-mutators","Accessors and Mutators",[289,1879,1880,1881,1884],{},"Return a ",[293,1882,1883],{},"Glueful\\Database\\ORM\\Casts\\Attribute"," from a method named after the attribute in camelCase:",[319,1886,1888],{"className":321,"code":1887,"language":323,"meta":324,"style":324},"use Glueful\\Database\\ORM\\Casts\\Attribute;\n\nprotected function title(): Attribute\n{\n    return Attribute::make(\n        get: fn (?string $value) => $value === null ? null : ucfirst($value),\n        set: fn (string $value) => trim($value),\n    );\n}\n",[293,1889,1890,1915,1919,1937,1941,1958,2015,2045,2050],{"__ignoreMap":324},[328,1891,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1913],{"class":330,"line":331},[328,1893,595],{"class":509},[328,1895,599],{"class":598},[328,1897,578],{"class":602},[328,1899,53],{"class":598},[328,1901,578],{"class":602},[328,1903,609],{"class":598},[328,1905,578],{"class":602},[328,1907,1437],{"class":598},[328,1909,578],{"class":602},[328,1911,1912],{"class":614},"Attribute",[328,1914,584],{"class":334},[328,1916,1917],{"class":330,"line":373},[328,1918,590],{"emptyLinePlaceholder":589},[328,1920,1921,1923,1926,1929,1932,1934],{"class":330,"line":436},[328,1922,1116],{"class":633},[328,1924,1925],{"class":627}," function",[328,1927,1928],{"class":353}," title",[328,1930,1931],{"class":334},"()",[328,1933,1674],{"class":342},[328,1935,1936],{"class":346}," Attribute\n",[328,1938,1939],{"class":330,"line":499},[328,1940,644],{"class":334},[328,1942,1943,1947,1950,1952,1955],{"class":330,"line":624},[328,1944,1946],{"class":1945},"sRxSC","    return",[328,1948,1949],{"class":346}," Attribute",[328,1951,350],{"class":342},[328,1953,1954],{"class":353},"make",[328,1956,1957],{"class":334},"(\n",[328,1959,1960,1964,1966,1969,1971,1974,1976,1978,1981,1983,1985,1987,1990,1993,1996,1999,2001,2004,2008,2010,2012],{"class":330,"line":641},[328,1961,1963],{"class":1962},"sQqfL","        get",[328,1965,1674],{"class":334},[328,1967,1968],{"class":627}," fn",[328,1970,1109],{"class":334},[328,1972,1973],{"class":342},"?",[328,1975,1179],{"class":509},[328,1977,536],{"class":334},[328,1979,1980],{"class":338},"value",[328,1982,394],{"class":334},[328,1984,468],{"class":334},[328,1986,536],{"class":334},[328,1988,1989],{"class":338},"value ",[328,1991,1992],{"class":342},"===",[328,1994,1995],{"class":1201}," null",[328,1997,1998],{"class":342}," ?",[328,2000,1995],{"class":1201},[328,2002,2003],{"class":342}," :",[328,2005,2007],{"class":2006},"sMLJd"," ucfirst",[328,2009,357],{"class":334},[328,2011,1980],{"class":338},[328,2013,2014],{"class":334},"),\n",[328,2016,2017,2020,2022,2024,2026,2028,2030,2032,2034,2036,2039,2041,2043],{"class":330,"line":647},[328,2018,2019],{"class":1962},"        set",[328,2021,1674],{"class":334},[328,2023,1968],{"class":627},[328,2025,1109],{"class":334},[328,2027,1179],{"class":509},[328,2029,536],{"class":334},[328,2031,1980],{"class":338},[328,2033,394],{"class":334},[328,2035,468],{"class":334},[328,2037,2038],{"class":2006}," trim",[328,2040,357],{"class":334},[328,2042,1980],{"class":338},[328,2044,2014],{"class":334},[328,2046,2047],{"class":330,"line":672},[328,2048,2049],{"class":334},"    );\n",[328,2051,2052],{"class":330,"line":695},[328,2053,909],{"class":334},[289,2055,2056,2057,1099,2060,2063,2064,2067,2068,555],{},"The classic method form also works: ",[293,2058,2059],{},"getFullNameAttribute($value)",[293,2061,2062],{},"setFullNameAttribute($value)",". Only the classic ",[293,2065,2066],{},"get…Attribute"," form is used for ",[293,2069,1070],{},[557,2071,2073],{"id":2072},"querying","Querying",[289,2075,2076,2079,2080,2083,2084,1251,2086,1251,2089,1251,2092,1251,2095,1251,2098,1251,2101,1251,2104,1251,2107,1251,2110,2113,2114,555],{},[293,2077,2078],{},"Model::query($context)"," returns an ORM ",[293,2081,2082],{},"Builder",". It has the familiar filters (",[293,2085,400],{},[293,2087,2088],{},"orWhere",[293,2090,2091],{},"whereIn",[293,2093,2094],{},"whereNull",[293,2096,2097],{},"orderBy",[293,2099,2100],{},"latest",[293,2102,2103],{},"limit",[293,2105,2106],{},"offset",[293,2108,2109],{},"join",[293,2111,2112],{},"groupBy",", …), and any other query builder method is forwarded to the underlying ",[302,2115,304],{"href":54},[319,2117,2119],{"className":321,"code":2118,"language":323,"meta":324,"style":324},"// Collections of models\n$posts = Post::query($context)\n    ->where('status', 'published')\n    ->whereIn('user_id', [1, 2, 3])\n    ->latest()                       // ORDER BY created_at DESC\n    ->limit(20)\n    ->get();                         // Glueful\\Database\\ORM\\Collection\n\n// Single models\n$post  = Post::find($context, 42);                 // ?Post\n$post  = Post::findOrFail($context, 42);           // throws ModelNotFoundException -> 404\n$first = Post::query($context)->where('slug', $slug)->first();\n\n// Shortcuts\n$all   = Post::all($context);\n$count = Post::query($context)->where('status', 'draft')->count();\n$any   = Post::query($context)->where('user_id', 7)->exists();\n",[293,2120,2121,2126,2147,2172,2206,2217,2230,2242,2246,2251,2278,2306,2355,2359,2364,2386,2437],{"__ignoreMap":324},[328,2122,2123],{"class":330,"line":331},[328,2124,2125],{"class":544},"// Collections of models\n",[328,2127,2128,2130,2132,2134,2136,2138,2140,2142,2144],{"class":330,"line":373},[328,2129,335],{"class":334},[328,2131,378],{"class":338},[328,2133,343],{"class":342},[328,2135,347],{"class":346},[328,2137,350],{"class":342},[328,2139,387],{"class":353},[328,2141,357],{"class":334},[328,2143,360],{"class":338},[328,2145,2146],{"class":334},")\n",[328,2148,2149,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170],{"class":330,"line":436},[328,2150,2151],{"class":342},"    ->",[328,2153,400],{"class":353},[328,2155,403],{"class":334},[328,2157,407],{"class":406},[328,2159,411],{"class":410},[328,2161,407],{"class":406},[328,2163,363],{"class":334},[328,2165,418],{"class":406},[328,2167,421],{"class":410},[328,2169,407],{"class":406},[328,2171,2146],{"class":334},[328,2173,2174,2176,2178,2180,2182,2184,2186,2188,2190,2193,2195,2198,2200,2203],{"class":330,"line":499},[328,2175,2151],{"class":342},[328,2177,2091],{"class":353},[328,2179,403],{"class":334},[328,2181,407],{"class":406},[328,2183,719],{"class":410},[328,2185,407],{"class":406},[328,2187,363],{"class":334},[328,2189,458],{"class":334},[328,2191,2192],{"class":366},"1",[328,2194,363],{"class":334},[328,2196,2197],{"class":366}," 2",[328,2199,363],{"class":334},[328,2201,2202],{"class":366}," 3",[328,2204,2205],{"class":334},"])\n",[328,2207,2208,2210,2212,2214],{"class":330,"line":624},[328,2209,2151],{"class":342},[328,2211,2100],{"class":353},[328,2213,1931],{"class":334},[328,2215,2216],{"class":544},"                       // ORDER BY created_at DESC\n",[328,2218,2219,2221,2223,2225,2228],{"class":330,"line":641},[328,2220,2151],{"class":342},[328,2222,2103],{"class":353},[328,2224,403],{"class":334},[328,2226,2227],{"class":366},"20",[328,2229,2146],{"class":334},[328,2231,2232,2234,2236,2239],{"class":330,"line":647},[328,2233,2151],{"class":342},[328,2235,430],{"class":353},[328,2237,2238],{"class":334},"();",[328,2240,2241],{"class":544},"                         // Glueful\\Database\\ORM\\Collection\n",[328,2243,2244],{"class":330,"line":672},[328,2245,590],{"emptyLinePlaceholder":589},[328,2247,2248],{"class":330,"line":695},[328,2249,2250],{"class":544},"// Single models\n",[328,2252,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275],{"class":330,"line":700},[328,2254,335],{"class":334},[328,2256,339],{"class":338},[328,2258,343],{"class":342},[328,2260,347],{"class":346},[328,2262,350],{"class":342},[328,2264,354],{"class":353},[328,2266,357],{"class":334},[328,2268,360],{"class":338},[328,2270,363],{"class":334},[328,2272,367],{"class":366},[328,2274,541],{"class":334},[328,2276,2277],{"class":544},"                 // ?Post\n",[328,2279,2280,2282,2284,2286,2288,2290,2293,2295,2297,2299,2301,2303],{"class":330,"line":760},[328,2281,335],{"class":334},[328,2283,339],{"class":338},[328,2285,343],{"class":342},[328,2287,347],{"class":346},[328,2289,350],{"class":342},[328,2291,2292],{"class":353},"findOrFail",[328,2294,357],{"class":334},[328,2296,360],{"class":338},[328,2298,363],{"class":334},[328,2300,367],{"class":366},[328,2302,541],{"class":334},[328,2304,2305],{"class":544},"           // throws ModelNotFoundException -> 404\n",[328,2307,2308,2310,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2338,2340,2342,2344,2346,2348,2350,2353],{"class":330,"line":765},[328,2309,335],{"class":334},[328,2311,2312],{"class":338},"first ",[328,2314,343],{"class":342},[328,2316,347],{"class":346},[328,2318,350],{"class":342},[328,2320,387],{"class":353},[328,2322,357],{"class":334},[328,2324,360],{"class":338},[328,2326,394],{"class":334},[328,2328,397],{"class":342},[328,2330,400],{"class":353},[328,2332,403],{"class":334},[328,2334,407],{"class":406},[328,2336,2337],{"class":410},"slug",[328,2339,407],{"class":406},[328,2341,363],{"class":334},[328,2343,536],{"class":334},[328,2345,2337],{"class":338},[328,2347,394],{"class":334},[328,2349,397],{"class":342},[328,2351,2352],{"class":353},"first",[328,2354,433],{"class":334},[328,2356,2357],{"class":330,"line":790},[328,2358,590],{"emptyLinePlaceholder":589},[328,2360,2361],{"class":330,"line":795},[328,2362,2363],{"class":544},"// Shortcuts\n",[328,2365,2366,2368,2371,2373,2375,2377,2380,2382,2384],{"class":330,"line":812},[328,2367,335],{"class":334},[328,2369,2370],{"class":338},"all   ",[328,2372,343],{"class":342},[328,2374,347],{"class":346},[328,2376,350],{"class":342},[328,2378,2379],{"class":353},"all",[328,2381,357],{"class":334},[328,2383,360],{"class":338},[328,2385,370],{"class":334},[328,2387,2388,2390,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415,2417,2419,2421,2423,2426,2428,2430,2432,2435],{"class":330,"line":835},[328,2389,335],{"class":334},[328,2391,2392],{"class":338},"count ",[328,2394,343],{"class":342},[328,2396,347],{"class":346},[328,2398,350],{"class":342},[328,2400,387],{"class":353},[328,2402,357],{"class":334},[328,2404,360],{"class":338},[328,2406,394],{"class":334},[328,2408,397],{"class":342},[328,2410,400],{"class":353},[328,2412,403],{"class":334},[328,2414,407],{"class":406},[328,2416,411],{"class":410},[328,2418,407],{"class":406},[328,2420,363],{"class":334},[328,2422,418],{"class":406},[328,2424,2425],{"class":410},"draft",[328,2427,407],{"class":406},[328,2429,394],{"class":334},[328,2431,397],{"class":342},[328,2433,2434],{"class":353},"count",[328,2436,433],{"class":334},[328,2438,2439,2441,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2475,2477,2479,2482],{"class":330,"line":856},[328,2440,335],{"class":334},[328,2442,2443],{"class":338},"any   ",[328,2445,343],{"class":342},[328,2447,347],{"class":346},[328,2449,350],{"class":342},[328,2451,387],{"class":353},[328,2453,357],{"class":334},[328,2455,360],{"class":338},[328,2457,394],{"class":334},[328,2459,397],{"class":342},[328,2461,400],{"class":353},[328,2463,403],{"class":334},[328,2465,407],{"class":406},[328,2467,719],{"class":410},[328,2469,407],{"class":406},[328,2471,363],{"class":334},[328,2473,2474],{"class":366}," 7",[328,2476,394],{"class":334},[328,2478,397],{"class":342},[328,2480,2481],{"class":353},"exists",[328,2483,433],{"class":334},[289,2485,2486,2487,2490,2491,1251,2494,1251,2497,1251,2500,1251,2503,1251,2506,1251,2509,1251,2512,1251,2515,1251,2518,1099,2520,555],{},"The ORM ",[293,2488,2489],{},"Collection"," is iterable and array-accessible, and adds helpers such as ",[293,2492,2493],{},"first()",[293,2495,2496],{},"map()",[293,2498,2499],{},"filter()",[293,2501,2502],{},"where()",[293,2504,2505],{},"pluck()",[293,2507,2508],{},"keyBy()",[293,2510,2511],{},"groupBy()",[293,2513,2514],{},"sortBy()",[293,2516,2517],{},"sum()",[293,2519,1062],{},[293,2521,2522],{},"toJson()",[289,2524,2525,2526,2529,2530,555],{},"For large tables, process rows in batches with ",[293,2527,2528],{},"chunk(500, fn ($posts, $page) => ...)"," or iterate them with ",[293,2531,2532],{},"each(fn ($post) => ...)",[1241,2534,2536],{"id":2535},"pagination","Pagination",[289,2538,2539,2542,2543,2546,2547,2549,2550,1099,2553,2556],{},[293,2540,2541],{},"paginate()"," returns the query builder's pagination array, with ",[293,2544,2545],{},"data"," holding a ",[293,2548,2489],{}," of models. ",[293,2551,2552],{},"with()",[293,2554,2555],{},"withCount()"," are applied to the page:",[319,2558,2560],{"className":321,"code":2559,"language":323,"meta":324,"style":324},"$page = Post::query($context)\n    ->where('status', 'published')\n    ->with('author')\n    ->paginate(1, 20);\n// ['data' => Collection\u003CPost>, 'current_page' => 1, 'per_page' => 20, 'total' => 135, 'last_page' => 7, ...]\n\n$page['data']->first()->author->name;\n",[293,2561,2562,2583,2607,2625,2643,2648,2652],{"__ignoreMap":324},[328,2563,2564,2566,2569,2571,2573,2575,2577,2579,2581],{"class":330,"line":331},[328,2565,335],{"class":334},[328,2567,2568],{"class":338},"page ",[328,2570,343],{"class":342},[328,2572,347],{"class":346},[328,2574,350],{"class":342},[328,2576,387],{"class":353},[328,2578,357],{"class":334},[328,2580,360],{"class":338},[328,2582,2146],{"class":334},[328,2584,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605],{"class":330,"line":373},[328,2586,2151],{"class":342},[328,2588,400],{"class":353},[328,2590,403],{"class":334},[328,2592,407],{"class":406},[328,2594,411],{"class":410},[328,2596,407],{"class":406},[328,2598,363],{"class":334},[328,2600,418],{"class":406},[328,2602,421],{"class":410},[328,2604,407],{"class":406},[328,2606,2146],{"class":334},[328,2608,2609,2611,2614,2616,2618,2621,2623],{"class":330,"line":436},[328,2610,2151],{"class":342},[328,2612,2613],{"class":353},"with",[328,2615,403],{"class":334},[328,2617,407],{"class":406},[328,2619,2620],{"class":410},"author",[328,2622,407],{"class":406},[328,2624,2146],{"class":334},[328,2626,2627,2629,2632,2634,2636,2638,2641],{"class":330,"line":499},[328,2628,2151],{"class":342},[328,2630,2631],{"class":353},"paginate",[328,2633,403],{"class":334},[328,2635,2192],{"class":366},[328,2637,363],{"class":334},[328,2639,2640],{"class":366}," 20",[328,2642,370],{"class":334},[328,2644,2645],{"class":330,"line":624},[328,2646,2647],{"class":544},"// ['data' => Collection\u003CPost>, 'current_page' => 1, 'per_page' => 20, 'total' => 135, 'last_page' => 7, ...]\n",[328,2649,2650],{"class":330,"line":641},[328,2651,590],{"emptyLinePlaceholder":589},[328,2653,2654,2656,2659,2662,2664,2666,2668,2671,2673,2675,2677,2679,2681,2683,2685],{"class":330,"line":647},[328,2655,335],{"class":334},[328,2657,2658],{"class":338},"page",[328,2660,2661],{"class":334},"[",[328,2663,407],{"class":406},[328,2665,2545],{"class":410},[328,2667,407],{"class":406},[328,2669,2670],{"class":334},"]",[328,2672,397],{"class":342},[328,2674,2352],{"class":353},[328,2676,1931],{"class":334},[328,2678,397],{"class":342},[328,2680,2620],{"class":338},[328,2682,397],{"class":342},[328,2684,1231],{"class":338},[328,2686,584],{"class":334},[1836,2688,2689],{"color":1838,"icon":1839,"variant":1840},[1842,2690,2691],{"v-slot:description":324},[289,2692,2693,2695,2696,2698,2699,2702,2703,2706,2707,2710,2711,1019,2714,2717],{},[310,2694,1848],{}," ",[293,2697,2545],{}," used to hold plain row arrays. Change ",[293,2700,2701],{},"$row['title']"," to ",[293,2704,2705],{},"$row->title",", or call ",[293,2708,2709],{},"$page['data']->toArray()",". ",[293,2712,2713],{},"JsonResource::collection()",[293,2715,2716],{},"ModelResource::collection()"," accept the collection as-is.",[289,2719,2720,2721,2724,2725,2727,2728,2731,2732,2735,2736,555],{},"Return the page through a typed ",[293,2722,2723],{},"PaginatedResponse"," (see ",[302,2726,33],{"href":34},") or ",[293,2729,2730],{},"Response::paginated()",". To page manually, combine ",[293,2733,2734],{},"forPage($page, 20)->get()"," with a separate ",[293,2737,2738],{},"count()",[557,2740,2742],{"id":2741},"creating-updating-deleting","Creating, Updating, Deleting",[319,2744,2746],{"className":321,"code":2745,"language":323,"meta":324,"style":324},"// Create\n$post = Post::create($context, ['user_id' => 1, 'title' => 'Hello', 'body' => '...']);\n$post->id;                     // generated key is read back\n\n$post = new Post(['title' => 'Draft'], $context);\n$post->user_id = 1;\n$post->save();\n\n$tag = Tag::firstOrCreate($context, ['slug' => 'php'], ['name' => 'PHP']);\n$setting = Setting::updateOrCreate($context, ['key' => 'theme'], ['value' => 'dark']);\n\n// Update one model (only dirty columns are written)\n$post = Post::findOrFail($context, 42);\n$post->title = 'Updated';\n$post->save();\n\n$post->update(['status' => 'published']);   // fill + save\n\n$post->isDirty('title');   // before saving\n$post->getChanges();\n\n// Update many rows at once (no model events)\nPost::query($context)->where('status', 'draft')->update(['status' => 'archived']);\n\n// Delete\n$post->delete();\nPost::destroy($context, [1, 2, 3]);         // loads and deletes each model\n",[293,2747,2748,2753,2821,2837,2841,2877,2894,2907,2911,2971,3033,3037,3042,3066,3088,3100,3104,3137,3141,3165,3178,3183,3189,3249,3254,3260,3274],{"__ignoreMap":324},[328,2749,2750],{"class":330,"line":331},[328,2751,2752],{"class":544},"// Create\n",[328,2754,2755,2757,2760,2762,2764,2766,2768,2770,2772,2774,2776,2778,2780,2782,2784,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,2807,2809,2811,2813,2815,2817,2819],{"class":330,"line":373},[328,2756,335],{"class":334},[328,2758,2759],{"class":338},"post ",[328,2761,343],{"class":342},[328,2763,347],{"class":346},[328,2765,350],{"class":342},[328,2767,449],{"class":353},[328,2769,357],{"class":334},[328,2771,360],{"class":338},[328,2773,363],{"class":334},[328,2775,458],{"class":334},[328,2777,407],{"class":406},[328,2779,719],{"class":410},[328,2781,407],{"class":406},[328,2783,468],{"class":342},[328,2785,2786],{"class":366}," 1",[328,2788,363],{"class":334},[328,2790,418],{"class":406},[328,2792,463],{"class":410},[328,2794,407],{"class":406},[328,2796,468],{"class":342},[328,2798,418],{"class":406},[328,2800,473],{"class":410},[328,2802,407],{"class":406},[328,2804,363],{"class":334},[328,2806,418],{"class":406},[328,2808,482],{"class":410},[328,2810,407],{"class":406},[328,2812,468],{"class":342},[328,2814,418],{"class":406},[328,2816,491],{"class":410},[328,2818,407],{"class":406},[328,2820,496],{"class":334},[328,2822,2823,2825,2827,2829,2831,2834],{"class":330,"line":436},[328,2824,335],{"class":334},[328,2826,1350],{"class":338},[328,2828,397],{"class":342},[328,2830,688],{"class":338},[328,2832,2833],{"class":334},";",[328,2835,2836],{"class":544},"                     // generated key is read back\n",[328,2838,2839],{"class":330,"line":499},[328,2840,590],{"emptyLinePlaceholder":589},[328,2842,2843,2845,2847,2849,2851,2853,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875],{"class":330,"line":624},[328,2844,335],{"class":334},[328,2846,2759],{"class":338},[328,2848,343],{"class":342},[328,2850,510],{"class":509},[328,2852,347],{"class":346},[328,2854,515],{"class":334},[328,2856,407],{"class":406},[328,2858,463],{"class":410},[328,2860,407],{"class":406},[328,2862,468],{"class":342},[328,2864,418],{"class":406},[328,2866,528],{"class":410},[328,2868,407],{"class":406},[328,2870,533],{"class":334},[328,2872,536],{"class":334},[328,2874,360],{"class":338},[328,2876,370],{"class":334},[328,2878,2879,2881,2883,2885,2888,2890,2892],{"class":330,"line":641},[328,2880,335],{"class":334},[328,2882,1350],{"class":338},[328,2884,397],{"class":342},[328,2886,2887],{"class":338},"user_id ",[328,2889,343],{"class":342},[328,2891,2786],{"class":366},[328,2893,584],{"class":334},[328,2895,2896,2898,2900,2902,2905],{"class":330,"line":647},[328,2897,335],{"class":334},[328,2899,1350],{"class":338},[328,2901,397],{"class":342},[328,2903,2904],{"class":353},"save",[328,2906,433],{"class":334},[328,2908,2909],{"class":330,"line":672},[328,2910,590],{"emptyLinePlaceholder":589},[328,2912,2913,2915,2918,2920,2923,2925,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2967,2969],{"class":330,"line":695},[328,2914,335],{"class":334},[328,2916,2917],{"class":338},"tag ",[328,2919,343],{"class":342},[328,2921,2922],{"class":346}," Tag",[328,2924,350],{"class":342},[328,2926,2927],{"class":353},"firstOrCreate",[328,2929,357],{"class":334},[328,2931,360],{"class":338},[328,2933,363],{"class":334},[328,2935,458],{"class":334},[328,2937,407],{"class":406},[328,2939,2337],{"class":410},[328,2941,407],{"class":406},[328,2943,468],{"class":342},[328,2945,418],{"class":406},[328,2947,323],{"class":410},[328,2949,407],{"class":406},[328,2951,533],{"class":334},[328,2953,458],{"class":334},[328,2955,407],{"class":406},[328,2957,1231],{"class":410},[328,2959,407],{"class":406},[328,2961,468],{"class":342},[328,2963,418],{"class":406},[328,2965,2966],{"class":410},"PHP",[328,2968,407],{"class":406},[328,2970,496],{"class":334},[328,2972,2973,2975,2978,2980,2983,2985,2988,2990,2992,2994,2996,2998,3001,3003,3005,3007,3010,3012,3014,3016,3018,3020,3022,3024,3026,3029,3031],{"class":330,"line":700},[328,2974,335],{"class":334},[328,2976,2977],{"class":338},"setting ",[328,2979,343],{"class":342},[328,2981,2982],{"class":346}," Setting",[328,2984,350],{"class":342},[328,2986,2987],{"class":353},"updateOrCreate",[328,2989,357],{"class":334},[328,2991,360],{"class":338},[328,2993,363],{"class":334},[328,2995,458],{"class":334},[328,2997,407],{"class":406},[328,2999,3000],{"class":410},"key",[328,3002,407],{"class":406},[328,3004,468],{"class":342},[328,3006,418],{"class":406},[328,3008,3009],{"class":410},"theme",[328,3011,407],{"class":406},[328,3013,533],{"class":334},[328,3015,458],{"class":334},[328,3017,407],{"class":406},[328,3019,1980],{"class":410},[328,3021,407],{"class":406},[328,3023,468],{"class":342},[328,3025,418],{"class":406},[328,3027,3028],{"class":410},"dark",[328,3030,407],{"class":406},[328,3032,496],{"class":334},[328,3034,3035],{"class":330,"line":760},[328,3036,590],{"emptyLinePlaceholder":589},[328,3038,3039],{"class":330,"line":765},[328,3040,3041],{"class":544},"// Update one model (only dirty columns are written)\n",[328,3043,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064],{"class":330,"line":790},[328,3045,335],{"class":334},[328,3047,2759],{"class":338},[328,3049,343],{"class":342},[328,3051,347],{"class":346},[328,3053,350],{"class":342},[328,3055,2292],{"class":353},[328,3057,357],{"class":334},[328,3059,360],{"class":338},[328,3061,363],{"class":334},[328,3063,367],{"class":366},[328,3065,370],{"class":334},[328,3067,3068,3070,3072,3074,3077,3079,3081,3084,3086],{"class":330,"line":795},[328,3069,335],{"class":334},[328,3071,1350],{"class":338},[328,3073,397],{"class":342},[328,3075,3076],{"class":338},"title ",[328,3078,343],{"class":342},[328,3080,418],{"class":406},[328,3082,3083],{"class":410},"Updated",[328,3085,407],{"class":406},[328,3087,584],{"class":334},[328,3089,3090,3092,3094,3096,3098],{"class":330,"line":812},[328,3091,335],{"class":334},[328,3093,1350],{"class":338},[328,3095,397],{"class":342},[328,3097,2904],{"class":353},[328,3099,433],{"class":334},[328,3101,3102],{"class":330,"line":835},[328,3103,590],{"emptyLinePlaceholder":589},[328,3105,3106,3108,3110,3112,3115,3117,3119,3121,3123,3125,3127,3129,3131,3134],{"class":330,"line":856},[328,3107,335],{"class":334},[328,3109,1350],{"class":338},[328,3111,397],{"class":342},[328,3113,3114],{"class":353},"update",[328,3116,515],{"class":334},[328,3118,407],{"class":406},[328,3120,411],{"class":410},[328,3122,407],{"class":406},[328,3124,468],{"class":342},[328,3126,418],{"class":406},[328,3128,421],{"class":410},[328,3130,407],{"class":406},[328,3132,3133],{"class":334},"]);",[328,3135,3136],{"class":544},"   // fill + save\n",[328,3138,3139],{"class":330,"line":877},[328,3140,590],{"emptyLinePlaceholder":589},[328,3142,3143,3145,3147,3149,3152,3154,3156,3158,3160,3162],{"class":330,"line":900},[328,3144,335],{"class":334},[328,3146,1350],{"class":338},[328,3148,397],{"class":342},[328,3150,3151],{"class":353},"isDirty",[328,3153,403],{"class":334},[328,3155,407],{"class":406},[328,3157,463],{"class":410},[328,3159,407],{"class":406},[328,3161,541],{"class":334},[328,3163,3164],{"class":544},"   // before saving\n",[328,3166,3167,3169,3171,3173,3176],{"class":330,"line":906},[328,3168,335],{"class":334},[328,3170,1350],{"class":338},[328,3172,397],{"class":342},[328,3174,3175],{"class":353},"getChanges",[328,3177,433],{"class":334},[328,3179,3181],{"class":330,"line":3180},21,[328,3182,590],{"emptyLinePlaceholder":589},[328,3184,3186],{"class":330,"line":3185},22,[328,3187,3188],{"class":544},"// Update many rows at once (no model events)\n",[328,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3245,3247],{"class":330,"line":3191},23,[328,3193,1398],{"class":346},[328,3195,350],{"class":342},[328,3197,387],{"class":353},[328,3199,357],{"class":334},[328,3201,360],{"class":338},[328,3203,394],{"class":334},[328,3205,397],{"class":342},[328,3207,400],{"class":353},[328,3209,403],{"class":334},[328,3211,407],{"class":406},[328,3213,411],{"class":410},[328,3215,407],{"class":406},[328,3217,363],{"class":334},[328,3219,418],{"class":406},[328,3221,2425],{"class":410},[328,3223,407],{"class":406},[328,3225,394],{"class":334},[328,3227,397],{"class":342},[328,3229,3114],{"class":353},[328,3231,515],{"class":334},[328,3233,407],{"class":406},[328,3235,411],{"class":410},[328,3237,407],{"class":406},[328,3239,468],{"class":342},[328,3241,418],{"class":406},[328,3243,3244],{"class":410},"archived",[328,3246,407],{"class":406},[328,3248,496],{"class":334},[328,3250,3252],{"class":330,"line":3251},24,[328,3253,590],{"emptyLinePlaceholder":589},[328,3255,3257],{"class":330,"line":3256},25,[328,3258,3259],{"class":544},"// Delete\n",[328,3261,3263,3265,3267,3269,3272],{"class":330,"line":3262},26,[328,3264,335],{"class":334},[328,3266,1350],{"class":338},[328,3268,397],{"class":342},[328,3270,3271],{"class":353},"delete",[328,3273,433],{"class":334},[328,3275,3277,3279,3281,3284,3286,3288,3290,3292,3294,3296,3298,3300,3302,3304],{"class":330,"line":3276},27,[328,3278,1398],{"class":346},[328,3280,350],{"class":342},[328,3282,3283],{"class":353},"destroy",[328,3285,357],{"class":334},[328,3287,360],{"class":338},[328,3289,363],{"class":334},[328,3291,458],{"class":334},[328,3293,2192],{"class":366},[328,3295,363],{"class":334},[328,3297,2197],{"class":366},[328,3299,363],{"class":334},[328,3301,2202],{"class":366},[328,3303,3133],{"class":334},[328,3305,3306],{"class":544},"         // loads and deletes each model\n",[289,3308,3309,3312,3313,3316,3317,3320],{},[293,3310,3311],{},"refresh()"," reloads the current instance from the database, ",[293,3314,3315],{},"fresh()"," returns a new copy, and ",[293,3318,3319],{},"replicate()"," clones the attributes without the primary key.",[557,3322,3324],{"id":3323},"soft-deletes","Soft Deletes",[289,3326,3327,3328,3331,3332,3335,3336,3339],{},"Soft deletes follow the table, exactly as in the ",[302,3329,304],{"href":3330},"/essentials/database#soft-deletes",": if the table has a ",[293,3333,3334],{},"deleted_at"," column, the model's ",[293,3337,3338],{},"delete()"," sets it instead of removing the row, and queries skip soft-deleted rows. No configuration is needed.",[319,3341,3343],{"className":321,"code":3342,"language":323,"meta":324,"style":324},"$post->delete();                                        // UPDATE posts SET deleted_at = ...\n\nPost::find($context, $id);                              // null once soft-deleted\nPost::query($context)->withTrashed()->get();            // include soft-deleted rows\nPost::query($context)->onlyTrashed()->get();            // only soft-deleted rows\nPost::query($context)->where('id', $id)->restore();     // clear deleted_at on trashed rows\nPost::query($context)->where('id', $id)->forceDelete(); // permanent DELETE\n",[293,3344,3345,3360,3364,3387,3417,3447,3491],{"__ignoreMap":324},[328,3346,3347,3349,3351,3353,3355,3357],{"class":330,"line":331},[328,3348,335],{"class":334},[328,3350,1350],{"class":338},[328,3352,397],{"class":342},[328,3354,3271],{"class":353},[328,3356,2238],{"class":334},[328,3358,3359],{"class":544},"                                        // UPDATE posts SET deleted_at = ...\n",[328,3361,3362],{"class":330,"line":373},[328,3363,590],{"emptyLinePlaceholder":589},[328,3365,3366,3368,3370,3372,3374,3376,3378,3380,3382,3384],{"class":330,"line":436},[328,3367,1398],{"class":346},[328,3369,350],{"class":342},[328,3371,354],{"class":353},[328,3373,357],{"class":334},[328,3375,360],{"class":338},[328,3377,363],{"class":334},[328,3379,536],{"class":334},[328,3381,688],{"class":338},[328,3383,541],{"class":334},[328,3385,3386],{"class":544},"                              // null once soft-deleted\n",[328,3388,3389,3391,3393,3395,3397,3399,3401,3403,3406,3408,3410,3412,3414],{"class":330,"line":499},[328,3390,1398],{"class":346},[328,3392,350],{"class":342},[328,3394,387],{"class":353},[328,3396,357],{"class":334},[328,3398,360],{"class":338},[328,3400,394],{"class":334},[328,3402,397],{"class":342},[328,3404,3405],{"class":353},"withTrashed",[328,3407,1931],{"class":334},[328,3409,397],{"class":342},[328,3411,430],{"class":353},[328,3413,2238],{"class":334},[328,3415,3416],{"class":544},"            // include soft-deleted rows\n",[328,3418,3419,3421,3423,3425,3427,3429,3431,3433,3436,3438,3440,3442,3444],{"class":330,"line":624},[328,3420,1398],{"class":346},[328,3422,350],{"class":342},[328,3424,387],{"class":353},[328,3426,357],{"class":334},[328,3428,360],{"class":338},[328,3430,394],{"class":334},[328,3432,397],{"class":342},[328,3434,3435],{"class":353},"onlyTrashed",[328,3437,1931],{"class":334},[328,3439,397],{"class":342},[328,3441,430],{"class":353},[328,3443,2238],{"class":334},[328,3445,3446],{"class":544},"            // only soft-deleted rows\n",[328,3448,3449,3451,3453,3455,3457,3459,3461,3463,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3486,3488],{"class":330,"line":641},[328,3450,1398],{"class":346},[328,3452,350],{"class":342},[328,3454,387],{"class":353},[328,3456,357],{"class":334},[328,3458,360],{"class":338},[328,3460,394],{"class":334},[328,3462,397],{"class":342},[328,3464,400],{"class":353},[328,3466,403],{"class":334},[328,3468,407],{"class":406},[328,3470,688],{"class":410},[328,3472,407],{"class":406},[328,3474,363],{"class":334},[328,3476,536],{"class":334},[328,3478,688],{"class":338},[328,3480,394],{"class":334},[328,3482,397],{"class":342},[328,3484,3485],{"class":353},"restore",[328,3487,2238],{"class":334},[328,3489,3490],{"class":544},"     // clear deleted_at on trashed rows\n",[328,3492,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523,3525,3527,3530,3532],{"class":330,"line":647},[328,3494,1398],{"class":346},[328,3496,350],{"class":342},[328,3498,387],{"class":353},[328,3500,357],{"class":334},[328,3502,360],{"class":338},[328,3504,394],{"class":334},[328,3506,397],{"class":342},[328,3508,400],{"class":353},[328,3510,403],{"class":334},[328,3512,407],{"class":406},[328,3514,688],{"class":410},[328,3516,407],{"class":406},[328,3518,363],{"class":334},[328,3520,536],{"class":334},[328,3522,688],{"class":338},[328,3524,394],{"class":334},[328,3526,397],{"class":342},[328,3528,3529],{"class":353},"forceDelete",[328,3531,2238],{"class":334},[328,3533,3534],{"class":544}," // permanent DELETE\n",[289,3536,3537,3538,3541],{},"Add the ",[293,3539,3540],{},"Glueful\\Database\\ORM\\Concerns\\SoftDeletes"," trait for the instance methods and their events:",[319,3543,3545],{"className":321,"code":3544,"language":323,"meta":324,"style":324},"use Glueful\\Database\\ORM\\Concerns\\SoftDeletes;\n\nclass Post extends Model\n{\n    use SoftDeletes;\n}\n\n$post->delete();        // soft delete; the instance still exists\n$post->trashed();       // true\n$post->restore();       // clears deleted_at and saves\n$post->forceDelete();   // permanent DELETE, trashed or not\n",[293,3546,3547,3573,3577,3587,3591,3601,3605,3609,3624,3640,3655],{"__ignoreMap":324},[328,3548,3549,3551,3553,3555,3557,3559,3561,3563,3566,3568,3571],{"class":330,"line":331},[328,3550,595],{"class":509},[328,3552,599],{"class":598},[328,3554,578],{"class":602},[328,3556,53],{"class":598},[328,3558,578],{"class":602},[328,3560,609],{"class":598},[328,3562,578],{"class":602},[328,3564,3565],{"class":598},"Concerns",[328,3567,578],{"class":602},[328,3569,3570],{"class":614},"SoftDeletes",[328,3572,584],{"class":334},[328,3574,3575],{"class":330,"line":373},[328,3576,590],{"emptyLinePlaceholder":589},[328,3578,3579,3581,3583,3585],{"class":330,"line":436},[328,3580,628],{"class":627},[328,3582,347],{"class":573},[328,3584,634],{"class":633},[328,3586,638],{"class":637},[328,3588,3589],{"class":330,"line":499},[328,3590,644],{"class":334},[328,3592,3593,3596,3599],{"class":330,"line":624},[328,3594,3595],{"class":509},"    use",[328,3597,3598],{"class":614}," SoftDeletes",[328,3600,584],{"class":334},[328,3602,3603],{"class":330,"line":641},[328,3604,909],{"class":334},[328,3606,3607],{"class":330,"line":647},[328,3608,590],{"emptyLinePlaceholder":589},[328,3610,3611,3613,3615,3617,3619,3621],{"class":330,"line":672},[328,3612,335],{"class":334},[328,3614,1350],{"class":338},[328,3616,397],{"class":342},[328,3618,3271],{"class":353},[328,3620,2238],{"class":334},[328,3622,3623],{"class":544},"        // soft delete; the instance still exists\n",[328,3625,3626,3628,3630,3632,3635,3637],{"class":330,"line":695},[328,3627,335],{"class":334},[328,3629,1350],{"class":338},[328,3631,397],{"class":342},[328,3633,3634],{"class":353},"trashed",[328,3636,2238],{"class":334},[328,3638,3639],{"class":544},"       // true\n",[328,3641,3642,3644,3646,3648,3650,3652],{"class":330,"line":700},[328,3643,335],{"class":334},[328,3645,1350],{"class":338},[328,3647,397],{"class":342},[328,3649,3485],{"class":353},[328,3651,2238],{"class":334},[328,3653,3654],{"class":544},"       // clears deleted_at and saves\n",[328,3656,3657,3659,3661,3663,3665,3667],{"class":330,"line":760},[328,3658,335],{"class":334},[328,3660,1350],{"class":338},[328,3662,397],{"class":342},[328,3664,3529],{"class":353},[328,3666,2238],{"class":334},[328,3668,3669],{"class":544},"   // permanent DELETE, trashed or not\n",[1836,3671,3672],{"color":1838,"icon":1839,"variant":1840},[1842,3673,3674],{"v-slot:description":324},[289,3675,3676,2695,3678,3681,3682,3685],{},[310,3677,1848],{},[293,3679,3680],{},"forceDelete()"," (instance and builder) issues a real ",[293,3683,3684],{},"DELETE","; it used to soft-delete. Check that existing callers mean to remove rows permanently.",[557,3687,3689],{"id":3688},"relationships","Relationships",[289,3691,3692,3693,3695,3696,3699,3700,1834],{},"Declare a relationship as a method with a relation return type. Defaults are derived from class names (",[293,3694,1398],{}," → foreign key ",[293,3697,3698],{},"post_id","; pivot table = the two snake_case class names sorted alphabetically, e.g. ",[293,3701,3702],{},"role_user",[319,3704,3706],{"className":321,"code":3705,"language":323,"meta":324,"style":324},"use Glueful\\Database\\ORM\\Relations\\{BelongsTo, BelongsToMany, HasMany, HasOne};\n\nclass User extends Model\n{\n    public function profile(): HasOne\n    {\n        return $this->hasOne(Profile::class);                  // profiles.user_id\n    }\n\n    public function posts(): HasMany\n    {\n        return $this->hasMany(Post::class);                    // posts.user_id\n    }\n\n    public function roles(): BelongsToMany\n    {\n        return $this->belongsToMany(Role::class)               // role_user (user_id, role_id)\n            ->withPivot('granted_at');\n    }\n}\n\nclass Post extends Model\n{\n    public function author(): BelongsTo\n    {\n        return $this->belongsTo(User::class, 'user_id');       // posts.user_id -> users.id\n    }\n}\n",[293,3707,3708,3751,3755,3766,3770,3786,3791,3819,3824,3828,3844,3848,3872,3876,3880,3896,3900,3925,3944,3948,3952,3956,3966,3970,3986,3990,4023,4027],{"__ignoreMap":324},[328,3709,3710,3712,3714,3716,3718,3720,3722,3724,3727,3729,3731,3734,3736,3739,3741,3744,3746,3749],{"class":330,"line":331},[328,3711,595],{"class":509},[328,3713,599],{"class":598},[328,3715,578],{"class":602},[328,3717,53],{"class":598},[328,3719,578],{"class":602},[328,3721,609],{"class":598},[328,3723,578],{"class":602},[328,3725,3726],{"class":598},"Relations",[328,3728,578],{"class":602},[328,3730,1600],{"class":334},[328,3732,3733],{"class":614},"BelongsTo",[328,3735,363],{"class":334},[328,3737,3738],{"class":614}," BelongsToMany",[328,3740,363],{"class":334},[328,3742,3743],{"class":614}," HasMany",[328,3745,363],{"class":334},[328,3747,3748],{"class":614}," HasOne",[328,3750,1631],{"class":334},[328,3752,3753],{"class":330,"line":373},[328,3754,590],{"emptyLinePlaceholder":589},[328,3756,3757,3759,3762,3764],{"class":330,"line":436},[328,3758,628],{"class":627},[328,3760,3761],{"class":573}," User",[328,3763,634],{"class":633},[328,3765,638],{"class":637},[328,3767,3768],{"class":330,"line":499},[328,3769,644],{"class":334},[328,3771,3772,3774,3776,3779,3781,3783],{"class":330,"line":624},[328,3773,1188],{"class":633},[328,3775,1925],{"class":627},[328,3777,3778],{"class":353}," profile",[328,3780,1931],{"class":334},[328,3782,1674],{"class":342},[328,3784,3785],{"class":346}," HasOne\n",[328,3787,3788],{"class":330,"line":641},[328,3789,3790],{"class":334},"    {\n",[328,3792,3793,3796,3800,3802,3805,3807,3810,3812,3814,3816],{"class":330,"line":647},[328,3794,3795],{"class":1945},"        return",[328,3797,3799],{"class":3798},"sSBr1"," $this",[328,3801,397],{"class":342},[328,3803,3804],{"class":353},"hasOne",[328,3806,403],{"class":334},[328,3808,3809],{"class":346},"Profile",[328,3811,350],{"class":342},[328,3813,628],{"class":509},[328,3815,541],{"class":334},[328,3817,3818],{"class":544},"                  // profiles.user_id\n",[328,3820,3821],{"class":330,"line":672},[328,3822,3823],{"class":334},"    }\n",[328,3825,3826],{"class":330,"line":695},[328,3827,590],{"emptyLinePlaceholder":589},[328,3829,3830,3832,3834,3837,3839,3841],{"class":330,"line":700},[328,3831,1188],{"class":633},[328,3833,1925],{"class":627},[328,3835,3836],{"class":353}," posts",[328,3838,1931],{"class":334},[328,3840,1674],{"class":342},[328,3842,3843],{"class":346}," HasMany\n",[328,3845,3846],{"class":330,"line":760},[328,3847,3790],{"class":334},[328,3849,3850,3852,3854,3856,3859,3861,3863,3865,3867,3869],{"class":330,"line":765},[328,3851,3795],{"class":1945},[328,3853,3799],{"class":3798},[328,3855,397],{"class":342},[328,3857,3858],{"class":353},"hasMany",[328,3860,403],{"class":334},[328,3862,1398],{"class":346},[328,3864,350],{"class":342},[328,3866,628],{"class":509},[328,3868,541],{"class":334},[328,3870,3871],{"class":544},"                    // posts.user_id\n",[328,3873,3874],{"class":330,"line":790},[328,3875,3823],{"class":334},[328,3877,3878],{"class":330,"line":795},[328,3879,590],{"emptyLinePlaceholder":589},[328,3881,3882,3884,3886,3889,3891,3893],{"class":330,"line":812},[328,3883,1188],{"class":633},[328,3885,1925],{"class":627},[328,3887,3888],{"class":353}," roles",[328,3890,1931],{"class":334},[328,3892,1674],{"class":342},[328,3894,3895],{"class":346}," BelongsToMany\n",[328,3897,3898],{"class":330,"line":835},[328,3899,3790],{"class":334},[328,3901,3902,3904,3906,3908,3911,3913,3916,3918,3920,3922],{"class":330,"line":856},[328,3903,3795],{"class":1945},[328,3905,3799],{"class":3798},[328,3907,397],{"class":342},[328,3909,3910],{"class":353},"belongsToMany",[328,3912,403],{"class":334},[328,3914,3915],{"class":346},"Role",[328,3917,350],{"class":342},[328,3919,628],{"class":509},[328,3921,394],{"class":334},[328,3923,3924],{"class":544},"               // role_user (user_id, role_id)\n",[328,3926,3927,3930,3933,3935,3937,3940,3942],{"class":330,"line":877},[328,3928,3929],{"class":342},"            ->",[328,3931,3932],{"class":353},"withPivot",[328,3934,403],{"class":334},[328,3936,407],{"class":406},[328,3938,3939],{"class":410},"granted_at",[328,3941,407],{"class":406},[328,3943,370],{"class":334},[328,3945,3946],{"class":330,"line":900},[328,3947,3823],{"class":334},[328,3949,3950],{"class":330,"line":906},[328,3951,909],{"class":334},[328,3953,3954],{"class":330,"line":3180},[328,3955,590],{"emptyLinePlaceholder":589},[328,3957,3958,3960,3962,3964],{"class":330,"line":3185},[328,3959,628],{"class":627},[328,3961,347],{"class":573},[328,3963,634],{"class":633},[328,3965,638],{"class":637},[328,3967,3968],{"class":330,"line":3191},[328,3969,644],{"class":334},[328,3971,3972,3974,3976,3979,3981,3983],{"class":330,"line":3251},[328,3973,1188],{"class":633},[328,3975,1925],{"class":627},[328,3977,3978],{"class":353}," author",[328,3980,1931],{"class":334},[328,3982,1674],{"class":342},[328,3984,3985],{"class":346}," BelongsTo\n",[328,3987,3988],{"class":330,"line":3256},[328,3989,3790],{"class":334},[328,3991,3992,3994,3996,3998,4001,4003,4006,4008,4010,4012,4014,4016,4018,4020],{"class":330,"line":3262},[328,3993,3795],{"class":1945},[328,3995,3799],{"class":3798},[328,3997,397],{"class":342},[328,3999,4000],{"class":353},"belongsTo",[328,4002,403],{"class":334},[328,4004,4005],{"class":346},"User",[328,4007,350],{"class":342},[328,4009,628],{"class":509},[328,4011,363],{"class":334},[328,4013,418],{"class":406},[328,4015,719],{"class":410},[328,4017,407],{"class":406},[328,4019,541],{"class":334},[328,4021,4022],{"class":544},"       // posts.user_id -> users.id\n",[328,4024,4025],{"class":330,"line":3276},[328,4026,3823],{"class":334},[328,4028,4030],{"class":330,"line":4029},28,[328,4031,909],{"class":334},[911,4033,4034,4044],{},[914,4035,4036],{},[917,4037,4038,4041],{},[920,4039,4040],{},"Method",[920,4042,4043],{},"Signature (all keys optional)",[930,4045,4046,4059,4070,4081],{},[917,4047,4048,4054],{},[935,4049,4050,1019,4052],{},[293,4051,3804],{},[293,4053,3858],{},[935,4055,4056],{},[293,4057,4058],{},"(Related::class, $foreignKey, $localKey)",[917,4060,4061,4065],{},[935,4062,4063],{},[293,4064,4000],{},[935,4066,4067],{},[293,4068,4069],{},"(Related::class, $foreignKey, $ownerKey, $relation)",[917,4071,4072,4076],{},[935,4073,4074],{},[293,4075,3910],{},[935,4077,4078],{},[293,4079,4080],{},"(Related::class, $table, $foreignPivotKey, $relatedPivotKey, $parentKey, $relatedKey, $relation)",[917,4082,4083,4091],{},[935,4084,4085,1019,4088],{},[293,4086,4087],{},"hasOneThrough",[293,4089,4090],{},"hasManyThrough",[935,4092,4093],{},[293,4094,4095],{},"(Related::class, Through::class, $firstKey, $secondKey, $localKey, $secondLocalKey)",[289,4097,4098,4100,4101,1109,4104,946,4107,4110],{},[293,4099,4000],{}," guesses its foreign key from the ",[310,4102,4103],{},"method name",[293,4105,4106],{},"author()",[293,4108,4109],{},"author_id","), so pass the key explicitly when the column is named after the related model.",[289,4112,4113],{},"Read a relation as a property to load and cache it, or call the method to keep building the query:",[319,4115,4117],{"className":321,"code":4116,"language":323,"meta":324,"style":324},"$user->posts;                                    // Collection, loaded once then cached\n$user->posts()->where('status', 'draft')->get(); // constrained query\n$post->author?->name;\n\nforeach ($user->roles as $role) {\n    $role->pivot->granted_at;                    // pivot columns from withPivot()\n}\n",[293,4118,4119,4135,4178,4195,4199,4227,4248],{"__ignoreMap":324},[328,4120,4121,4123,4126,4128,4130,4132],{"class":330,"line":331},[328,4122,335],{"class":334},[328,4124,4125],{"class":338},"user",[328,4127,397],{"class":342},[328,4129,665],{"class":338},[328,4131,2833],{"class":334},[328,4133,4134],{"class":544},"                                    // Collection, loaded once then cached\n",[328,4136,4137,4139,4141,4143,4145,4147,4149,4151,4153,4155,4157,4159,4161,4163,4165,4167,4169,4171,4173,4175],{"class":330,"line":373},[328,4138,335],{"class":334},[328,4140,4125],{"class":338},[328,4142,397],{"class":342},[328,4144,665],{"class":353},[328,4146,1931],{"class":334},[328,4148,397],{"class":342},[328,4150,400],{"class":353},[328,4152,403],{"class":334},[328,4154,407],{"class":406},[328,4156,411],{"class":410},[328,4158,407],{"class":406},[328,4160,363],{"class":334},[328,4162,418],{"class":406},[328,4164,2425],{"class":410},[328,4166,407],{"class":406},[328,4168,394],{"class":334},[328,4170,397],{"class":342},[328,4172,430],{"class":353},[328,4174,2238],{"class":334},[328,4176,4177],{"class":544}," // constrained query\n",[328,4179,4180,4182,4184,4186,4188,4191,4193],{"class":330,"line":436},[328,4181,335],{"class":334},[328,4183,1350],{"class":338},[328,4185,397],{"class":342},[328,4187,2620],{"class":338},[328,4189,4190],{"class":342},"?->",[328,4192,1231],{"class":338},[328,4194,584],{"class":334},[328,4196,4197],{"class":330,"line":499},[328,4198,590],{"emptyLinePlaceholder":589},[328,4200,4201,4204,4207,4209,4211,4214,4217,4219,4222,4224],{"class":330,"line":624},[328,4202,4203],{"class":1945},"foreach",[328,4205,4206],{"class":334}," ($",[328,4208,4125],{"class":338},[328,4210,397],{"class":342},[328,4212,4213],{"class":338},"roles ",[328,4215,4216],{"class":342},"as",[328,4218,536],{"class":334},[328,4220,4221],{"class":338},"role",[328,4223,394],{"class":334},[328,4225,4226],{"class":334}," {\n",[328,4228,4229,4232,4234,4236,4239,4241,4243,4245],{"class":330,"line":641},[328,4230,4231],{"class":334},"    $",[328,4233,4221],{"class":338},[328,4235,397],{"class":342},[328,4237,4238],{"class":338},"pivot",[328,4240,397],{"class":342},[328,4242,3939],{"class":338},[328,4244,2833],{"class":334},[328,4246,4247],{"class":544},"                    // pivot columns from withPivot()\n",[328,4249,4250],{"class":330,"line":647},[328,4251,909],{"class":334},[289,4253,4254],{},"Many-to-many pivot rows are managed through the relation:",[319,4256,4258],{"className":321,"code":4257,"language":323,"meta":324,"style":324},"$user->roles()->attach($roleId, ['granted_at' => date('Y-m-d H:i:s')]);\n$user->roles()->detach($roleId);                 // remove one (or an array of ids)\n$user->roles()->detach();                        // remove all of this user's pivot rows\n$user->roles()->sync([1, 2, 3]);                 // returns attached / detached / updated ids\n$user->roles()->toggle([4]);\n",[293,4259,4260,4309,4335,4356,4390],{"__ignoreMap":324},[328,4261,4262,4264,4266,4268,4271,4273,4275,4278,4280,4283,4285,4287,4289,4291,4293,4295,4298,4300,4302,4304,4306],{"class":330,"line":331},[328,4263,335],{"class":334},[328,4265,4125],{"class":338},[328,4267,397],{"class":342},[328,4269,4270],{"class":353},"roles",[328,4272,1931],{"class":334},[328,4274,397],{"class":342},[328,4276,4277],{"class":353},"attach",[328,4279,357],{"class":334},[328,4281,4282],{"class":338},"roleId",[328,4284,363],{"class":334},[328,4286,458],{"class":334},[328,4288,407],{"class":406},[328,4290,3939],{"class":410},[328,4292,407],{"class":406},[328,4294,468],{"class":342},[328,4296,4297],{"class":2006}," date",[328,4299,403],{"class":334},[328,4301,407],{"class":406},[328,4303,1264],{"class":410},[328,4305,407],{"class":406},[328,4307,4308],{"class":334},")]);\n",[328,4310,4311,4313,4315,4317,4319,4321,4323,4326,4328,4330,4332],{"class":330,"line":373},[328,4312,335],{"class":334},[328,4314,4125],{"class":338},[328,4316,397],{"class":342},[328,4318,4270],{"class":353},[328,4320,1931],{"class":334},[328,4322,397],{"class":342},[328,4324,4325],{"class":353},"detach",[328,4327,357],{"class":334},[328,4329,4282],{"class":338},[328,4331,541],{"class":334},[328,4333,4334],{"class":544},"                 // remove one (or an array of ids)\n",[328,4336,4337,4339,4341,4343,4345,4347,4349,4351,4353],{"class":330,"line":436},[328,4338,335],{"class":334},[328,4340,4125],{"class":338},[328,4342,397],{"class":342},[328,4344,4270],{"class":353},[328,4346,1931],{"class":334},[328,4348,397],{"class":342},[328,4350,4325],{"class":353},[328,4352,2238],{"class":334},[328,4354,4355],{"class":544},"                        // remove all of this user's pivot rows\n",[328,4357,4358,4360,4362,4364,4366,4368,4370,4373,4375,4377,4379,4381,4383,4385,4387],{"class":330,"line":499},[328,4359,335],{"class":334},[328,4361,4125],{"class":338},[328,4363,397],{"class":342},[328,4365,4270],{"class":353},[328,4367,1931],{"class":334},[328,4369,397],{"class":342},[328,4371,4372],{"class":353},"sync",[328,4374,515],{"class":334},[328,4376,2192],{"class":366},[328,4378,363],{"class":334},[328,4380,2197],{"class":366},[328,4382,363],{"class":334},[328,4384,2202],{"class":366},[328,4386,3133],{"class":334},[328,4388,4389],{"class":544},"                 // returns attached / detached / updated ids\n",[328,4391,4392,4394,4396,4398,4400,4402,4404,4407,4409,4412],{"class":330,"line":624},[328,4393,335],{"class":334},[328,4395,4125],{"class":338},[328,4397,397],{"class":342},[328,4399,4270],{"class":353},[328,4401,1931],{"class":334},[328,4403,397],{"class":342},[328,4405,4406],{"class":353},"toggle",[328,4408,515],{"class":334},[328,4410,4411],{"class":366},"4",[328,4413,496],{"class":334},[289,4415,4416,4419,4420,1251,4423,1251,4426,1251,4429,1099,4432,2710,4435,4437,4438,1099,4441,555],{},[293,4417,4418],{},"BelongsToMany"," also offers ",[293,4421,4422],{},"wherePivot()",[293,4424,4425],{},"wherePivotIn()",[293,4427,4428],{},"wherePivotNull()",[293,4430,4431],{},"orderByPivot()",[293,4433,4434],{},"withTimestamps()",[293,4436,3733],{}," has ",[293,4439,4440],{},"associate()",[293,4442,4443],{},"dissociate()",[1241,4445,4447],{"id":4446},"querying-relationship-existence","Querying Relationship Existence",[319,4449,4451],{"className":321,"code":4450,"language":323,"meta":324,"style":324},"$authors = User::query($context)->has('posts')->get();            // at least one post\n$prolific = User::query($context)->has('posts', '>=', 10)->get();\n$silent = User::query($context)->doesntHave('posts')->get();\n\n$active = User::query($context)\n    ->whereHas('posts', fn ($q) => $q->where('status', 'published'))\n    ->get();\n$commenters = User::query($context)->has('posts.comments')->get();  // nested\n",[293,4452,4453,4498,4553,4595,4599,4620,4675,4683],{"__ignoreMap":324},[328,4454,4455,4457,4460,4462,4464,4466,4468,4470,4472,4474,4476,4479,4481,4483,4485,4487,4489,4491,4493,4495],{"class":330,"line":331},[328,4456,335],{"class":334},[328,4458,4459],{"class":338},"authors ",[328,4461,343],{"class":342},[328,4463,3761],{"class":346},[328,4465,350],{"class":342},[328,4467,387],{"class":353},[328,4469,357],{"class":334},[328,4471,360],{"class":338},[328,4473,394],{"class":334},[328,4475,397],{"class":342},[328,4477,4478],{"class":353},"has",[328,4480,403],{"class":334},[328,4482,407],{"class":406},[328,4484,665],{"class":410},[328,4486,407],{"class":406},[328,4488,394],{"class":334},[328,4490,397],{"class":342},[328,4492,430],{"class":353},[328,4494,2238],{"class":334},[328,4496,4497],{"class":544},"            // at least one post\n",[328,4499,4500,4502,4505,4507,4509,4511,4513,4515,4517,4519,4521,4523,4525,4527,4529,4531,4533,4535,4538,4540,4542,4545,4547,4549,4551],{"class":330,"line":373},[328,4501,335],{"class":334},[328,4503,4504],{"class":338},"prolific ",[328,4506,343],{"class":342},[328,4508,3761],{"class":346},[328,4510,350],{"class":342},[328,4512,387],{"class":353},[328,4514,357],{"class":334},[328,4516,360],{"class":338},[328,4518,394],{"class":334},[328,4520,397],{"class":342},[328,4522,4478],{"class":353},[328,4524,403],{"class":334},[328,4526,407],{"class":406},[328,4528,665],{"class":410},[328,4530,407],{"class":406},[328,4532,363],{"class":334},[328,4534,418],{"class":406},[328,4536,4537],{"class":410},">=",[328,4539,407],{"class":406},[328,4541,363],{"class":334},[328,4543,4544],{"class":366}," 10",[328,4546,394],{"class":334},[328,4548,397],{"class":342},[328,4550,430],{"class":353},[328,4552,433],{"class":334},[328,4554,4555,4557,4560,4562,4564,4566,4568,4570,4572,4574,4576,4579,4581,4583,4585,4587,4589,4591,4593],{"class":330,"line":436},[328,4556,335],{"class":334},[328,4558,4559],{"class":338},"silent ",[328,4561,343],{"class":342},[328,4563,3761],{"class":346},[328,4565,350],{"class":342},[328,4567,387],{"class":353},[328,4569,357],{"class":334},[328,4571,360],{"class":338},[328,4573,394],{"class":334},[328,4575,397],{"class":342},[328,4577,4578],{"class":353},"doesntHave",[328,4580,403],{"class":334},[328,4582,407],{"class":406},[328,4584,665],{"class":410},[328,4586,407],{"class":406},[328,4588,394],{"class":334},[328,4590,397],{"class":342},[328,4592,430],{"class":353},[328,4594,433],{"class":334},[328,4596,4597],{"class":330,"line":499},[328,4598,590],{"emptyLinePlaceholder":589},[328,4600,4601,4603,4606,4608,4610,4612,4614,4616,4618],{"class":330,"line":624},[328,4602,335],{"class":334},[328,4604,4605],{"class":338},"active ",[328,4607,343],{"class":342},[328,4609,3761],{"class":346},[328,4611,350],{"class":342},[328,4613,387],{"class":353},[328,4615,357],{"class":334},[328,4617,360],{"class":338},[328,4619,2146],{"class":334},[328,4621,4622,4624,4627,4629,4631,4633,4635,4637,4639,4641,4644,4646,4648,4650,4652,4654,4656,4658,4660,4662,4664,4666,4668,4670,4672],{"class":330,"line":641},[328,4623,2151],{"class":342},[328,4625,4626],{"class":353},"whereHas",[328,4628,403],{"class":334},[328,4630,407],{"class":406},[328,4632,665],{"class":410},[328,4634,407],{"class":406},[328,4636,363],{"class":334},[328,4638,1968],{"class":627},[328,4640,4206],{"class":334},[328,4642,4643],{"class":338},"q",[328,4645,394],{"class":334},[328,4647,468],{"class":334},[328,4649,536],{"class":334},[328,4651,4643],{"class":338},[328,4653,397],{"class":342},[328,4655,400],{"class":353},[328,4657,403],{"class":334},[328,4659,407],{"class":406},[328,4661,411],{"class":410},[328,4663,407],{"class":406},[328,4665,363],{"class":334},[328,4667,418],{"class":406},[328,4669,421],{"class":410},[328,4671,407],{"class":406},[328,4673,4674],{"class":334},"))\n",[328,4676,4677,4679,4681],{"class":330,"line":647},[328,4678,2151],{"class":342},[328,4680,430],{"class":353},[328,4682,433],{"class":334},[328,4684,4685,4687,4690,4692,4694,4696,4698,4700,4702,4704,4706,4708,4710,4712,4715,4717,4719,4721,4723,4725],{"class":330,"line":672},[328,4686,335],{"class":334},[328,4688,4689],{"class":338},"commenters ",[328,4691,343],{"class":342},[328,4693,3761],{"class":346},[328,4695,350],{"class":342},[328,4697,387],{"class":353},[328,4699,357],{"class":334},[328,4701,360],{"class":338},[328,4703,394],{"class":334},[328,4705,397],{"class":342},[328,4707,4478],{"class":353},[328,4709,403],{"class":334},[328,4711,407],{"class":406},[328,4713,4714],{"class":410},"posts.comments",[328,4716,407],{"class":406},[328,4718,394],{"class":334},[328,4720,397],{"class":342},[328,4722,430],{"class":353},[328,4724,2238],{"class":334},[328,4726,4727],{"class":544},"  // nested\n",[289,4729,4730,4731,1019,4734,1019,4737,4740,4741,4743],{},"The ",[293,4732,4733],{},"whereHas()",[293,4735,4736],{},"orWhereHas()",[293,4738,4739],{},"whereDoesntHave()"," closure receives the related model's ORM ",[293,4742,2082],{},", so its scopes work there. A self-referencing relation, or a relation type that can't be correlated, throws rather than returning wrong rows.",[557,4745,4747],{"id":4746},"eager-loading","Eager Loading",[289,4749,4750,4751,4753],{},"Accessing a relation on each model of a collection runs one query per model (the N+1 problem). ",[293,4752,2552],{}," loads the relation for the whole result in one extra query:",[319,4755,4757],{"className":321,"code":4756,"language":323,"meta":324,"style":324},"$posts = Post::query($context)->with('author')->get();       // 2 queries total\n\n$users = User::with($context, ['posts', 'profile'])->get();  // static form, context first\n\n// Nested (every post gets its comments)\n$users = User::query($context)->with('posts.comments')->get();\n\n// belongsToMany and hasOneThrough / hasManyThrough relations eager-load too\n$users = User::query($context)->with('roles')->get();\n\n// Constrained\n$users = User::query($context)\n    ->with(['posts' => fn ($posts) => $posts->where('status', 'published')])\n    ->get();\n",[293,4758,4759,4802,4806,4856,4860,4865,4905,4909,4914,4954,4958,4963,4983,5036],{"__ignoreMap":324},[328,4760,4761,4763,4765,4767,4769,4771,4773,4775,4777,4779,4781,4783,4785,4787,4789,4791,4793,4795,4797,4799],{"class":330,"line":331},[328,4762,335],{"class":334},[328,4764,378],{"class":338},[328,4766,343],{"class":342},[328,4768,347],{"class":346},[328,4770,350],{"class":342},[328,4772,387],{"class":353},[328,4774,357],{"class":334},[328,4776,360],{"class":338},[328,4778,394],{"class":334},[328,4780,397],{"class":342},[328,4782,2613],{"class":353},[328,4784,403],{"class":334},[328,4786,407],{"class":406},[328,4788,2620],{"class":410},[328,4790,407],{"class":406},[328,4792,394],{"class":334},[328,4794,397],{"class":342},[328,4796,430],{"class":353},[328,4798,2238],{"class":334},[328,4800,4801],{"class":544},"       // 2 queries total\n",[328,4803,4804],{"class":330,"line":373},[328,4805,590],{"emptyLinePlaceholder":589},[328,4807,4808,4810,4813,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4835,4837,4839,4842,4844,4847,4849,4851,4853],{"class":330,"line":436},[328,4809,335],{"class":334},[328,4811,4812],{"class":338},"users ",[328,4814,343],{"class":342},[328,4816,3761],{"class":346},[328,4818,350],{"class":342},[328,4820,2613],{"class":353},[328,4822,357],{"class":334},[328,4824,360],{"class":338},[328,4826,363],{"class":334},[328,4828,458],{"class":334},[328,4830,407],{"class":406},[328,4832,665],{"class":410},[328,4834,407],{"class":406},[328,4836,363],{"class":334},[328,4838,418],{"class":406},[328,4840,4841],{"class":410},"profile",[328,4843,407],{"class":406},[328,4845,4846],{"class":334},"])",[328,4848,397],{"class":342},[328,4850,430],{"class":353},[328,4852,2238],{"class":334},[328,4854,4855],{"class":544},"  // static form, context first\n",[328,4857,4858],{"class":330,"line":499},[328,4859,590],{"emptyLinePlaceholder":589},[328,4861,4862],{"class":330,"line":624},[328,4863,4864],{"class":544},"// Nested (every post gets its comments)\n",[328,4866,4867,4869,4871,4873,4875,4877,4879,4881,4883,4885,4887,4889,4891,4893,4895,4897,4899,4901,4903],{"class":330,"line":641},[328,4868,335],{"class":334},[328,4870,4812],{"class":338},[328,4872,343],{"class":342},[328,4874,3761],{"class":346},[328,4876,350],{"class":342},[328,4878,387],{"class":353},[328,4880,357],{"class":334},[328,4882,360],{"class":338},[328,4884,394],{"class":334},[328,4886,397],{"class":342},[328,4888,2613],{"class":353},[328,4890,403],{"class":334},[328,4892,407],{"class":406},[328,4894,4714],{"class":410},[328,4896,407],{"class":406},[328,4898,394],{"class":334},[328,4900,397],{"class":342},[328,4902,430],{"class":353},[328,4904,433],{"class":334},[328,4906,4907],{"class":330,"line":647},[328,4908,590],{"emptyLinePlaceholder":589},[328,4910,4911],{"class":330,"line":672},[328,4912,4913],{"class":544},"// belongsToMany and hasOneThrough / hasManyThrough relations eager-load too\n",[328,4915,4916,4918,4920,4922,4924,4926,4928,4930,4932,4934,4936,4938,4940,4942,4944,4946,4948,4950,4952],{"class":330,"line":695},[328,4917,335],{"class":334},[328,4919,4812],{"class":338},[328,4921,343],{"class":342},[328,4923,3761],{"class":346},[328,4925,350],{"class":342},[328,4927,387],{"class":353},[328,4929,357],{"class":334},[328,4931,360],{"class":338},[328,4933,394],{"class":334},[328,4935,397],{"class":342},[328,4937,2613],{"class":353},[328,4939,403],{"class":334},[328,4941,407],{"class":406},[328,4943,4270],{"class":410},[328,4945,407],{"class":406},[328,4947,394],{"class":334},[328,4949,397],{"class":342},[328,4951,430],{"class":353},[328,4953,433],{"class":334},[328,4955,4956],{"class":330,"line":700},[328,4957,590],{"emptyLinePlaceholder":589},[328,4959,4960],{"class":330,"line":760},[328,4961,4962],{"class":544},"// Constrained\n",[328,4964,4965,4967,4969,4971,4973,4975,4977,4979,4981],{"class":330,"line":765},[328,4966,335],{"class":334},[328,4968,4812],{"class":338},[328,4970,343],{"class":342},[328,4972,3761],{"class":346},[328,4974,350],{"class":342},[328,4976,387],{"class":353},[328,4978,357],{"class":334},[328,4980,360],{"class":338},[328,4982,2146],{"class":334},[328,4984,4985,4987,4989,4991,4993,4995,4997,4999,5001,5003,5005,5007,5009,5011,5013,5015,5017,5019,5021,5023,5025,5027,5029,5031,5033],{"class":330,"line":790},[328,4986,2151],{"class":342},[328,4988,2613],{"class":353},[328,4990,515],{"class":334},[328,4992,407],{"class":406},[328,4994,665],{"class":410},[328,4996,407],{"class":406},[328,4998,468],{"class":342},[328,5000,1968],{"class":627},[328,5002,4206],{"class":334},[328,5004,665],{"class":338},[328,5006,394],{"class":334},[328,5008,468],{"class":334},[328,5010,536],{"class":334},[328,5012,665],{"class":338},[328,5014,397],{"class":342},[328,5016,400],{"class":353},[328,5018,403],{"class":334},[328,5020,407],{"class":406},[328,5022,411],{"class":410},[328,5024,407],{"class":406},[328,5026,363],{"class":334},[328,5028,418],{"class":406},[328,5030,421],{"class":410},[328,5032,407],{"class":406},[328,5034,5035],{"class":334},")])\n",[328,5037,5038,5040,5042],{"class":330,"line":795},[328,5039,2151],{"class":342},[328,5041,430],{"class":353},[328,5043,433],{"class":334},[289,5045,5046],{},"Load relations onto models you already have:",[319,5048,5050],{"className":321,"code":5049,"language":323,"meta":324,"style":324},"$user->load('posts');                 // always reloads\n$user->loadMissing('profile');        // only if not loaded yet\n$users->load('profile');              // on a whole Collection\n\n$user->loadCount('posts');\n$user->posts_count;                   // int\n",[293,5051,5052,5076,5100,5124,5128,5149],{"__ignoreMap":324},[328,5053,5054,5056,5058,5060,5063,5065,5067,5069,5071,5073],{"class":330,"line":331},[328,5055,335],{"class":334},[328,5057,4125],{"class":338},[328,5059,397],{"class":342},[328,5061,5062],{"class":353},"load",[328,5064,403],{"class":334},[328,5066,407],{"class":406},[328,5068,665],{"class":410},[328,5070,407],{"class":406},[328,5072,541],{"class":334},[328,5074,5075],{"class":544},"                 // always reloads\n",[328,5077,5078,5080,5082,5084,5087,5089,5091,5093,5095,5097],{"class":330,"line":373},[328,5079,335],{"class":334},[328,5081,4125],{"class":338},[328,5083,397],{"class":342},[328,5085,5086],{"class":353},"loadMissing",[328,5088,403],{"class":334},[328,5090,407],{"class":406},[328,5092,4841],{"class":410},[328,5094,407],{"class":406},[328,5096,541],{"class":334},[328,5098,5099],{"class":544},"        // only if not loaded yet\n",[328,5101,5102,5104,5107,5109,5111,5113,5115,5117,5119,5121],{"class":330,"line":436},[328,5103,335],{"class":334},[328,5105,5106],{"class":338},"users",[328,5108,397],{"class":342},[328,5110,5062],{"class":353},[328,5112,403],{"class":334},[328,5114,407],{"class":406},[328,5116,4841],{"class":410},[328,5118,407],{"class":406},[328,5120,541],{"class":334},[328,5122,5123],{"class":544},"              // on a whole Collection\n",[328,5125,5126],{"class":330,"line":499},[328,5127,590],{"emptyLinePlaceholder":589},[328,5129,5130,5132,5134,5136,5139,5141,5143,5145,5147],{"class":330,"line":624},[328,5131,335],{"class":334},[328,5133,4125],{"class":338},[328,5135,397],{"class":342},[328,5137,5138],{"class":353},"loadCount",[328,5140,403],{"class":334},[328,5142,407],{"class":406},[328,5144,665],{"class":410},[328,5146,407],{"class":406},[328,5148,370],{"class":334},[328,5150,5151,5153,5155,5157,5160,5162],{"class":330,"line":641},[328,5152,335],{"class":334},[328,5154,4125],{"class":338},[328,5156,397],{"class":342},[328,5158,5159],{"class":338},"posts_count",[328,5161,2833],{"class":334},[328,5163,5164],{"class":544},"                   // int\n",[289,5166,5167,5168,5170,5171,5174,5175,5178,5179,1674],{},"Count relations in the query itself with ",[293,5169,2555],{},". It runs one grouped ",[293,5172,5173],{},"COUNT"," query per relation and adds ",[293,5176,5177],{},"{relation}_count","; a closure constrains the count and receives the relation, like ",[293,5180,2552],{},[319,5182,5184],{"className":321,"code":5183,"language":323,"meta":324,"style":324},"$users = User::query($context)\n    ->withCount(['posts', 'comments' => fn ($q) => $q->where('approved', true)])\n    ->get();\n$users->first()->comments_count;\n",[293,5185,5186,5206,5266,5274],{"__ignoreMap":324},[328,5187,5188,5190,5192,5194,5196,5198,5200,5202,5204],{"class":330,"line":331},[328,5189,335],{"class":334},[328,5191,4812],{"class":338},[328,5193,343],{"class":342},[328,5195,3761],{"class":346},[328,5197,350],{"class":342},[328,5199,387],{"class":353},[328,5201,357],{"class":334},[328,5203,360],{"class":338},[328,5205,2146],{"class":334},[328,5207,5208,5210,5213,5215,5217,5219,5221,5223,5225,5228,5230,5232,5234,5236,5238,5240,5242,5244,5246,5248,5250,5252,5254,5257,5259,5261,5264],{"class":330,"line":373},[328,5209,2151],{"class":342},[328,5211,5212],{"class":353},"withCount",[328,5214,515],{"class":334},[328,5216,407],{"class":406},[328,5218,665],{"class":410},[328,5220,407],{"class":406},[328,5222,363],{"class":334},[328,5224,418],{"class":406},[328,5226,5227],{"class":410},"comments",[328,5229,407],{"class":406},[328,5231,468],{"class":342},[328,5233,1968],{"class":627},[328,5235,4206],{"class":334},[328,5237,4643],{"class":338},[328,5239,394],{"class":334},[328,5241,468],{"class":334},[328,5243,536],{"class":334},[328,5245,4643],{"class":338},[328,5247,397],{"class":342},[328,5249,400],{"class":353},[328,5251,403],{"class":334},[328,5253,407],{"class":406},[328,5255,5256],{"class":410},"approved",[328,5258,407],{"class":406},[328,5260,363],{"class":334},[328,5262,5263],{"class":1201}," true",[328,5265,5035],{"class":334},[328,5267,5268,5270,5272],{"class":330,"line":436},[328,5269,2151],{"class":342},[328,5271,430],{"class":353},[328,5273,433],{"class":334},[328,5275,5276,5278,5280,5282,5284,5286,5288,5291],{"class":330,"line":499},[328,5277,335],{"class":334},[328,5279,5106],{"class":338},[328,5281,397],{"class":342},[328,5283,2352],{"class":353},[328,5285,1931],{"class":334},[328,5287,397],{"class":342},[328,5289,5290],{"class":338},"comments_count",[328,5292,584],{"class":334},[289,5294,5295,5296,1099,5298,5301,5302,555],{},"Counts from ",[293,5297,2555],{},[293,5299,5300],{},"loadCount()"," are never written back by a later ",[293,5303,1254],{},[557,5305,5307],{"id":5306},"n1-detection","N+1 Detection",[289,5309,5310,5311,5313,5314,5317,5318,5321],{},"The ORM flags lazy loads that happen on models hydrated as part of a multi-row result: exactly the pattern ",[293,5312,2552],{}," exists to fix. Set the mode with ",[293,5315,5316],{},"DB_LAZY_LOADING_MODE"," (read from ",[293,5319,5320],{},"database.orm.lazy_loading_mode","):",[319,5323,5327],{"className":5324,"code":5325,"language":5326,"meta":324,"style":324},"language-env shiki shiki-themes material-theme-lighter github-light github-dark monokai","DB_LAZY_LOADING_MODE=auto\n","env",[293,5328,5329],{"__ignoreMap":324},[328,5330,5331],{"class":330,"line":331},[328,5332,5325],{},[911,5334,5335,5345],{},[914,5336,5337],{},[917,5338,5339,5342],{},[920,5340,5341],{},"Mode",[920,5343,5344],{},"Behaviour",[930,5346,5347,5368,5381,5394],{},[917,5348,5349,5355],{},[935,5350,5351,5354],{},[293,5352,5353],{},"auto"," (default)",[935,5356,5357,5360,5361,5364,5365],{},[293,5358,5359],{},"warn"," when ",[293,5362,5363],{},"APP_ENV=development",", otherwise ",[293,5366,5367],{},"off",[917,5369,5370,5374],{},[935,5371,5372],{},[293,5373,5359],{},[935,5375,5376,5377,5380],{},"Writes ",[293,5378,5379],{},"[GLUEFUL-N+1] Lazy-load detected on collection-loaded model: App\\Models\\User::posts. Add ->with('posts') to the query."," to the error log, once per model/relation pair",[917,5382,5383,5388],{},[935,5384,5385],{},[293,5386,5387],{},"strict",[935,5389,5390,5391],{},"Throws ",[293,5392,5393],{},"Glueful\\Database\\ORM\\Exceptions\\LazyLoadingViolationException",[917,5395,5396,5400],{},[935,5397,5398],{},[293,5399,5367],{},[935,5401,5402],{},"Disabled",[319,5404,5406],{"className":321,"code":5405,"language":323,"meta":324,"style":324},"$users = User::query($context)->get();\nforeach ($users as $user) {\n    $user->posts;          // flagged: lazy load on a collection-loaded model\n}\n\nUser::find($context, 1)->posts;                     // not flagged: single model\nUser::query($context)->with('posts')->get();        // not flagged: eager loaded\n",[293,5407,5408,5434,5452,5467,5471,5475,5502],{"__ignoreMap":324},[328,5409,5410,5412,5414,5416,5418,5420,5422,5424,5426,5428,5430,5432],{"class":330,"line":331},[328,5411,335],{"class":334},[328,5413,4812],{"class":338},[328,5415,343],{"class":342},[328,5417,3761],{"class":346},[328,5419,350],{"class":342},[328,5421,387],{"class":353},[328,5423,357],{"class":334},[328,5425,360],{"class":338},[328,5427,394],{"class":334},[328,5429,397],{"class":342},[328,5431,430],{"class":353},[328,5433,433],{"class":334},[328,5435,5436,5438,5440,5442,5444,5446,5448,5450],{"class":330,"line":373},[328,5437,4203],{"class":1945},[328,5439,4206],{"class":334},[328,5441,4812],{"class":338},[328,5443,4216],{"class":342},[328,5445,536],{"class":334},[328,5447,4125],{"class":338},[328,5449,394],{"class":334},[328,5451,4226],{"class":334},[328,5453,5454,5456,5458,5460,5462,5464],{"class":330,"line":436},[328,5455,4231],{"class":334},[328,5457,4125],{"class":338},[328,5459,397],{"class":342},[328,5461,665],{"class":338},[328,5463,2833],{"class":334},[328,5465,5466],{"class":544},"          // flagged: lazy load on a collection-loaded model\n",[328,5468,5469],{"class":330,"line":499},[328,5470,909],{"class":334},[328,5472,5473],{"class":330,"line":624},[328,5474,590],{"emptyLinePlaceholder":589},[328,5476,5477,5479,5481,5483,5485,5487,5489,5491,5493,5495,5497,5499],{"class":330,"line":641},[328,5478,4005],{"class":346},[328,5480,350],{"class":342},[328,5482,354],{"class":353},[328,5484,357],{"class":334},[328,5486,360],{"class":338},[328,5488,363],{"class":334},[328,5490,2786],{"class":366},[328,5492,394],{"class":334},[328,5494,397],{"class":342},[328,5496,665],{"class":338},[328,5498,2833],{"class":334},[328,5500,5501],{"class":544},"                     // not flagged: single model\n",[328,5503,5504,5506,5508,5510,5512,5514,5516,5518,5520,5522,5524,5526,5528,5530,5532,5534,5536],{"class":330,"line":647},[328,5505,4005],{"class":346},[328,5507,350],{"class":342},[328,5509,387],{"class":353},[328,5511,357],{"class":334},[328,5513,360],{"class":338},[328,5515,394],{"class":334},[328,5517,397],{"class":342},[328,5519,2613],{"class":353},[328,5521,403],{"class":334},[328,5523,407],{"class":406},[328,5525,665],{"class":410},[328,5527,407],{"class":406},[328,5529,394],{"class":334},[328,5531,397],{"class":342},[328,5533,430],{"class":353},[328,5535,2238],{"class":334},[328,5537,5538],{"class":544},"        // not flagged: eager loaded\n",[289,5540,5541],{},"Opt a single model out with the instance property:",[319,5543,5545],{"className":321,"code":5544,"language":323,"meta":324,"style":324},"class LegacyReport extends Model\n{\n    protected ?string $instanceLazyLoadingMode = 'off';\n}\n",[293,5546,5547,5558,5562,5585],{"__ignoreMap":324},[328,5548,5549,5551,5554,5556],{"class":330,"line":331},[328,5550,628],{"class":627},[328,5552,5553],{"class":573}," LegacyReport",[328,5555,634],{"class":633},[328,5557,638],{"class":637},[328,5559,5560],{"class":330,"line":373},[328,5561,644],{"class":334},[328,5563,5564,5566,5568,5570,5572,5575,5577,5579,5581,5583],{"class":330,"line":436},[328,5565,650],{"class":633},[328,5567,1998],{"class":342},[328,5569,1179],{"class":509},[328,5571,536],{"class":334},[328,5573,5574],{"class":338},"instanceLazyLoadingMode ",[328,5576,343],{"class":342},[328,5578,418],{"class":406},[328,5580,5367],{"class":410},[328,5582,407],{"class":406},[328,5584,584],{"class":334},[328,5586,5587],{"class":330,"line":499},[328,5588,909],{"class":334},[289,5590,5591],{},"Enforce it in tests, or route violations to your own logger:",[319,5593,5595],{"className":321,"code":5594,"language":323,"meta":324,"style":324},"use Glueful\\Database\\ORM\\Model;\n\nModel::preventLazyLoading('strict');\n\nModel::handleLazyLoadingViolationUsing(function (Model $model, string $relation) {\n    // replaces the default warn/throw behaviour; pass null to restore it\n});\n",[293,5596,5597,5617,5621,5640,5644,5680,5685],{"__ignoreMap":324},[328,5598,5599,5601,5603,5605,5607,5609,5611,5613,5615],{"class":330,"line":331},[328,5600,595],{"class":509},[328,5602,599],{"class":598},[328,5604,578],{"class":602},[328,5606,53],{"class":598},[328,5608,578],{"class":602},[328,5610,609],{"class":598},[328,5612,578],{"class":602},[328,5614,615],{"class":614},[328,5616,584],{"class":334},[328,5618,5619],{"class":330,"line":373},[328,5620,590],{"emptyLinePlaceholder":589},[328,5622,5623,5625,5627,5630,5632,5634,5636,5638],{"class":330,"line":436},[328,5624,615],{"class":346},[328,5626,350],{"class":342},[328,5628,5629],{"class":353},"preventLazyLoading",[328,5631,403],{"class":334},[328,5633,407],{"class":406},[328,5635,5387],{"class":410},[328,5637,407],{"class":406},[328,5639,370],{"class":334},[328,5641,5642],{"class":330,"line":499},[328,5643,590],{"emptyLinePlaceholder":589},[328,5645,5646,5648,5650,5653,5655,5658,5660,5662,5664,5667,5669,5671,5673,5676,5678],{"class":330,"line":624},[328,5647,615],{"class":346},[328,5649,350],{"class":342},[328,5651,5652],{"class":353},"handleLazyLoadingViolationUsing",[328,5654,403],{"class":334},[328,5656,5657],{"class":627},"function",[328,5659,1109],{"class":334},[328,5661,615],{"class":346},[328,5663,536],{"class":334},[328,5665,5666],{"class":338},"model",[328,5668,363],{"class":334},[328,5670,653],{"class":509},[328,5672,536],{"class":334},[328,5674,5675],{"class":338},"relation",[328,5677,394],{"class":334},[328,5679,4226],{"class":334},[328,5681,5682],{"class":330,"line":641},[328,5683,5684],{"class":544},"    // replaces the default warn/throw behaviour; pass null to restore it\n",[328,5686,5687],{"class":330,"line":647},[328,5688,5689],{"class":334},"});\n",[289,5691,5692,5693,5696,5697,5699],{},"On long-running runtimes, call ",[293,5694,5695],{},"Model::clearLazyLoadingWarnings()"," between requests so ",[293,5698,5359],{}," mode reports again.",[557,5701,5703],{"id":5702},"scopes","Scopes",[289,5705,5706,5707,5710,5711,5714],{},"A ",[310,5708,5709],{},"local scope"," is a ",[293,5712,5713],{},"scope","-prefixed method, called without the prefix:",[319,5716,5718],{"className":321,"code":5717,"language":323,"meta":324,"style":324},"use Glueful\\Database\\ORM\\Builder;\n\nclass Post extends Model\n{\n    public function scopePublished(Builder $query): Builder\n    {\n        return $query->where('status', 'published');\n    }\n\n    public function scopeBy(Builder $query, int $userId): Builder\n    {\n        return $query->where('user_id', $userId);\n    }\n}\n\n$posts = Post::query($context)->published()->by(7)->get();\n",[293,5719,5720,5740,5744,5754,5758,5782,5786,5816,5820,5824,5856,5860,5888,5892,5896,5900],{"__ignoreMap":324},[328,5721,5722,5724,5726,5728,5730,5732,5734,5736,5738],{"class":330,"line":331},[328,5723,595],{"class":509},[328,5725,599],{"class":598},[328,5727,578],{"class":602},[328,5729,53],{"class":598},[328,5731,578],{"class":602},[328,5733,609],{"class":598},[328,5735,578],{"class":602},[328,5737,2082],{"class":614},[328,5739,584],{"class":334},[328,5741,5742],{"class":330,"line":373},[328,5743,590],{"emptyLinePlaceholder":589},[328,5745,5746,5748,5750,5752],{"class":330,"line":436},[328,5747,628],{"class":627},[328,5749,347],{"class":573},[328,5751,634],{"class":633},[328,5753,638],{"class":637},[328,5755,5756],{"class":330,"line":499},[328,5757,644],{"class":334},[328,5759,5760,5762,5764,5767,5769,5771,5773,5775,5777,5779],{"class":330,"line":624},[328,5761,1188],{"class":633},[328,5763,1925],{"class":627},[328,5765,5766],{"class":353}," scopePublished",[328,5768,403],{"class":334},[328,5770,2082],{"class":346},[328,5772,536],{"class":334},[328,5774,387],{"class":338},[328,5776,394],{"class":334},[328,5778,1674],{"class":342},[328,5780,5781],{"class":346}," Builder\n",[328,5783,5784],{"class":330,"line":641},[328,5785,3790],{"class":334},[328,5787,5788,5790,5792,5794,5796,5798,5800,5802,5804,5806,5808,5810,5812,5814],{"class":330,"line":647},[328,5789,3795],{"class":1945},[328,5791,536],{"class":334},[328,5793,387],{"class":338},[328,5795,397],{"class":342},[328,5797,400],{"class":353},[328,5799,403],{"class":334},[328,5801,407],{"class":406},[328,5803,411],{"class":410},[328,5805,407],{"class":406},[328,5807,363],{"class":334},[328,5809,418],{"class":406},[328,5811,421],{"class":410},[328,5813,407],{"class":406},[328,5815,370],{"class":334},[328,5817,5818],{"class":330,"line":672},[328,5819,3823],{"class":334},[328,5821,5822],{"class":330,"line":695},[328,5823,590],{"emptyLinePlaceholder":589},[328,5825,5826,5828,5830,5833,5835,5837,5839,5841,5843,5846,5848,5850,5852,5854],{"class":330,"line":700},[328,5827,1188],{"class":633},[328,5829,1925],{"class":627},[328,5831,5832],{"class":353}," scopeBy",[328,5834,403],{"class":334},[328,5836,2082],{"class":346},[328,5838,536],{"class":334},[328,5840,387],{"class":338},[328,5842,363],{"class":334},[328,5844,5845],{"class":509}," int",[328,5847,536],{"class":334},[328,5849,1387],{"class":338},[328,5851,394],{"class":334},[328,5853,1674],{"class":342},[328,5855,5781],{"class":346},[328,5857,5858],{"class":330,"line":760},[328,5859,3790],{"class":334},[328,5861,5862,5864,5866,5868,5870,5872,5874,5876,5878,5880,5882,5884,5886],{"class":330,"line":765},[328,5863,3795],{"class":1945},[328,5865,536],{"class":334},[328,5867,387],{"class":338},[328,5869,397],{"class":342},[328,5871,400],{"class":353},[328,5873,403],{"class":334},[328,5875,407],{"class":406},[328,5877,719],{"class":410},[328,5879,407],{"class":406},[328,5881,363],{"class":334},[328,5883,536],{"class":334},[328,5885,1387],{"class":338},[328,5887,370],{"class":334},[328,5889,5890],{"class":330,"line":790},[328,5891,3823],{"class":334},[328,5893,5894],{"class":330,"line":795},[328,5895,909],{"class":334},[328,5897,5898],{"class":330,"line":812},[328,5899,590],{"emptyLinePlaceholder":589},[328,5901,5902,5904,5906,5908,5910,5912,5914,5916,5918,5920,5922,5924,5926,5928,5931,5933,5936,5938,5940,5942],{"class":330,"line":835},[328,5903,335],{"class":334},[328,5905,378],{"class":338},[328,5907,343],{"class":342},[328,5909,347],{"class":346},[328,5911,350],{"class":342},[328,5913,387],{"class":353},[328,5915,357],{"class":334},[328,5917,360],{"class":338},[328,5919,394],{"class":334},[328,5921,397],{"class":342},[328,5923,421],{"class":353},[328,5925,1931],{"class":334},[328,5927,397],{"class":342},[328,5929,5930],{"class":353},"by",[328,5932,403],{"class":334},[328,5934,5935],{"class":366},"7",[328,5937,394],{"class":334},[328,5939,397],{"class":342},[328,5941,430],{"class":353},[328,5943,433],{"class":334},[289,5945,5706,5946,5949,5950,5953,5954,1109,5957,5321],{},[310,5947,5948],{},"global scope"," applies to every query of the model. Register it in ",[293,5951,5952],{},"boot()",", as a closure or a class implementing ",[293,5955,5956],{},"Glueful\\Database\\ORM\\Contracts\\Scope",[293,5958,5959],{},"apply(Builder $builder, object $model): void",[319,5961,5963],{"className":321,"code":5962,"language":323,"meta":324,"style":324},"protected static function boot(): void\n{\n    static::addGlobalScope('tenant', function (Builder $query) {\n        $query->where('tenant_id', current_tenant_id());\n    });\n}\n\nPost::query($context)->withoutGlobalScope('tenant')->get();\nPost::query($context)->withoutGlobalScopes()->get();\n",[293,5964,5965,5984,5988,6023,6051,6056,6060,6064,6099],{"__ignoreMap":324},[328,5966,5967,5969,5972,5974,5977,5979,5981],{"class":330,"line":331},[328,5968,1116],{"class":633},[328,5970,5971],{"class":633}," static",[328,5973,1925],{"class":627},[328,5975,5976],{"class":353}," boot",[328,5978,1931],{"class":334},[328,5980,1674],{"class":342},[328,5982,5983],{"class":509}," void\n",[328,5985,5986],{"class":330,"line":373},[328,5987,644],{"class":334},[328,5989,5990,5993,5995,5998,6000,6002,6005,6007,6009,6011,6013,6015,6017,6019,6021],{"class":330,"line":436},[328,5991,5992],{"class":627},"    static",[328,5994,350],{"class":342},[328,5996,5997],{"class":353},"addGlobalScope",[328,5999,403],{"class":334},[328,6001,407],{"class":406},[328,6003,6004],{"class":410},"tenant",[328,6006,407],{"class":406},[328,6008,363],{"class":334},[328,6010,1925],{"class":627},[328,6012,1109],{"class":334},[328,6014,2082],{"class":346},[328,6016,536],{"class":334},[328,6018,387],{"class":338},[328,6020,394],{"class":334},[328,6022,4226],{"class":334},[328,6024,6025,6028,6030,6032,6034,6036,6038,6041,6043,6045,6048],{"class":330,"line":499},[328,6026,6027],{"class":334},"        $",[328,6029,387],{"class":338},[328,6031,397],{"class":342},[328,6033,400],{"class":353},[328,6035,403],{"class":334},[328,6037,407],{"class":406},[328,6039,6040],{"class":410},"tenant_id",[328,6042,407],{"class":406},[328,6044,363],{"class":334},[328,6046,6047],{"class":353}," current_tenant_id",[328,6049,6050],{"class":334},"());\n",[328,6052,6053],{"class":330,"line":624},[328,6054,6055],{"class":334},"    });\n",[328,6057,6058],{"class":330,"line":641},[328,6059,909],{"class":334},[328,6061,6062],{"class":330,"line":647},[328,6063,590],{"emptyLinePlaceholder":589},[328,6065,6066,6068,6070,6072,6074,6076,6078,6080,6083,6085,6087,6089,6091,6093,6095,6097],{"class":330,"line":672},[328,6067,1398],{"class":346},[328,6069,350],{"class":342},[328,6071,387],{"class":353},[328,6073,357],{"class":334},[328,6075,360],{"class":338},[328,6077,394],{"class":334},[328,6079,397],{"class":342},[328,6081,6082],{"class":353},"withoutGlobalScope",[328,6084,403],{"class":334},[328,6086,407],{"class":406},[328,6088,6004],{"class":410},[328,6090,407],{"class":406},[328,6092,394],{"class":334},[328,6094,397],{"class":342},[328,6096,430],{"class":353},[328,6098,433],{"class":334},[328,6100,6101,6103,6105,6107,6109,6111,6113,6115,6118,6120,6122,6124],{"class":330,"line":695},[328,6102,1398],{"class":346},[328,6104,350],{"class":342},[328,6106,387],{"class":353},[328,6108,357],{"class":334},[328,6110,360],{"class":338},[328,6112,394],{"class":334},[328,6114,397],{"class":342},[328,6116,6117],{"class":353},"withoutGlobalScopes",[328,6119,1931],{"class":334},[328,6121,397],{"class":342},[328,6123,430],{"class":353},[328,6125,433],{"class":334},[557,6127,6129],{"id":6128},"model-events","Model Events",[289,6131,6132,6133,1251,6136,1251,6139,1251,6142,1251,6145,1251,6148,1251,6151,1251,6154,6157,6158,6161,6162,6164,6165,1251,6167,1251,6170,1251,6173,1099,6176,6179,6180,1251,6183,1251,6186,1251,6189,1251,6192,6195,6196,1099,6198,6200],{},"Saving a model fires lifecycle events: ",[293,6134,6135],{},"creating",[293,6137,6138],{},"created",[293,6140,6141],{},"updating",[293,6143,6144],{},"updated",[293,6146,6147],{},"saving",[293,6149,6150],{},"saved",[293,6152,6153],{},"deleting",[293,6155,6156],{},"deleted",", plus ",[293,6159,6160],{},"retrieved"," for each hydrated row. Models using ",[293,6163,3570],{}," also fire ",[293,6166,3634],{},[293,6168,6169],{},"restoring",[293,6171,6172],{},"restored",[293,6174,6175],{},"forceDeleting",[293,6177,6178],{},"forceDeleted"," (register them with ",[293,6181,6182],{},"onTrashed()",[293,6184,6185],{},"restoring()",[293,6187,6188],{},"restored()",[293,6190,6191],{},"forceDeleting()",[293,6193,6194],{},"forceDeleted()","). Builder-level ",[293,6197,1293],{},[293,6199,3338],{}," bypass them.",[289,6202,6203,6204,1674],{},"Register callbacks in ",[293,6205,5952],{},[319,6207,6209],{"className":321,"code":6208,"language":323,"meta":324,"style":324},"protected static function boot(): void\n{\n    static::creating(function (Post $post) {\n        $post->slug ??= strtolower(preg_replace('/\\W+/', '-', $post->title));\n    });\n\n    static::deleted(function (Post $post) {\n        // clean up related files, caches, ...\n    });\n}\n",[293,6210,6211,6227,6231,6255,6313,6317,6321,6345,6350,6354],{"__ignoreMap":324},[328,6212,6213,6215,6217,6219,6221,6223,6225],{"class":330,"line":331},[328,6214,1116],{"class":633},[328,6216,5971],{"class":633},[328,6218,1925],{"class":627},[328,6220,5976],{"class":353},[328,6222,1931],{"class":334},[328,6224,1674],{"class":342},[328,6226,5983],{"class":509},[328,6228,6229],{"class":330,"line":373},[328,6230,644],{"class":334},[328,6232,6233,6235,6237,6239,6241,6243,6245,6247,6249,6251,6253],{"class":330,"line":436},[328,6234,5992],{"class":627},[328,6236,350],{"class":342},[328,6238,6135],{"class":353},[328,6240,403],{"class":334},[328,6242,5657],{"class":627},[328,6244,1109],{"class":334},[328,6246,1398],{"class":346},[328,6248,536],{"class":334},[328,6250,1350],{"class":338},[328,6252,394],{"class":334},[328,6254,4226],{"class":334},[328,6256,6257,6259,6261,6263,6266,6269,6272,6274,6277,6279,6282,6286,6289,6292,6294,6296,6299,6301,6303,6305,6307,6309,6311],{"class":330,"line":499},[328,6258,6027],{"class":334},[328,6260,1350],{"class":338},[328,6262,397],{"class":342},[328,6264,6265],{"class":338},"slug ",[328,6267,6268],{"class":342},"??=",[328,6270,6271],{"class":2006}," strtolower",[328,6273,403],{"class":334},[328,6275,6276],{"class":2006},"preg_replace",[328,6278,403],{"class":334},[328,6280,6281],{"class":406},"'/",[328,6283,6285],{"class":6284},"sqxi8","\\W",[328,6287,6288],{"class":342},"+",[328,6290,6291],{"class":406},"/'",[328,6293,363],{"class":334},[328,6295,418],{"class":406},[328,6297,6298],{"class":410},"-",[328,6300,407],{"class":406},[328,6302,363],{"class":334},[328,6304,536],{"class":334},[328,6306,1350],{"class":338},[328,6308,397],{"class":342},[328,6310,463],{"class":338},[328,6312,1433],{"class":334},[328,6314,6315],{"class":330,"line":624},[328,6316,6055],{"class":334},[328,6318,6319],{"class":330,"line":641},[328,6320,590],{"emptyLinePlaceholder":589},[328,6322,6323,6325,6327,6329,6331,6333,6335,6337,6339,6341,6343],{"class":330,"line":647},[328,6324,5992],{"class":627},[328,6326,350],{"class":342},[328,6328,6156],{"class":353},[328,6330,403],{"class":334},[328,6332,5657],{"class":627},[328,6334,1109],{"class":334},[328,6336,1398],{"class":346},[328,6338,536],{"class":334},[328,6340,1350],{"class":338},[328,6342,394],{"class":334},[328,6344,4226],{"class":334},[328,6346,6347],{"class":330,"line":672},[328,6348,6349],{"class":544},"        // clean up related files, caches, ...\n",[328,6351,6352],{"class":330,"line":695},[328,6353,6055],{"class":334},[328,6355,6356],{"class":330,"line":700},[328,6357,909],{"class":334},[289,6359,6360,6361,6364,6365,1251,6367,1251,6369,1251,6371,1251,6373,6375,6376,6378,6379,1019,6381,1019,6383,1019,6386,6388,6389,2710,6391,6393,6394,6396],{},"Returning ",[293,6362,6363],{},"false"," from a ",[293,6366,6147],{},[293,6368,6135],{},[293,6370,6141],{},[293,6372,6153],{},[293,6374,6169],{}," or ",[293,6377,6175],{}," callback cancels the write, and ",[293,6380,1254],{},[293,6382,3338],{},[293,6384,6385],{},"restore()",[293,6387,3680],{}," return ",[293,6390,6363],{},[310,6392,1848],{}," the return value used to be ignored, so check that no existing callback returns ",[293,6395,6363],{}," by accident.",[289,6398,6399,6400,6403,6404,1109,6407,1251,6410,1251,6413,6416,6417,6420,6421,2710,6424,6427,6428,6431,6432,555],{},"Each event is also dispatched through the ",[302,6401,6402],{"href":98},"event system"," as a class in ",[293,6405,6406],{},"Glueful\\Database\\ORM\\Events",[293,6408,6409],{},"ModelCreating",[293,6411,6412],{},"ModelCreated",[293,6414,6415],{},"ModelUpdating",", …, ",[293,6418,6419],{},"ModelRetrieved","), all extending ",[293,6422,6423],{},"BaseEvent",[293,6425,6426],{},"$event->getModel()"," returns the model. A listener on a ",[293,6429,6430],{},"…ing"," event can also cancel the write by calling ",[293,6433,6434],{},"$event->stopPropagation()",[289,6436,6437,6438,555],{},"Silence events for a single instance with ",[293,6439,6440],{},"$post->withoutEvents()->save()",[557,6442,6444],{"id":6443},"serialization","Serialization",[289,6446,6447,1251,6449,1099,6451,6454,6455,6457,6458,6460,6461,6465,6466,555],{},[293,6448,1062],{},[293,6450,2522],{},[293,6452,6453],{},"json_encode($model)"," include attributes (with casts applied and ",[293,6456,1049],{}," removed) plus loaded relations. Casted dates come out as ",[293,6459,1271],{}," objects. For a public API contract, map models into ",[302,6462,6464],{"href":6463},"/essentials/typed-io#response-dtos","response DTOs",": their serializer formats dates as ISO-8601 and the shape feeds the ",[302,6467,6468],{"href":150},"OpenAPI spec",[557,6470,6472],{"id":6471},"next-steps","Next Steps",[1296,6474,6475,6480,6485,6490],{},[1299,6476,6477,6479],{},[302,6478,53],{"href":54},": the query builder underneath every model",[1299,6481,6482,6484],{},[302,6483,61],{"href":62},": create the tables your models map to",[1299,6486,6487,6489],{},[302,6488,33],{"href":34},": validated input and typed output around your models",[1299,6491,6492,6494],{},[302,6493,157],{"href":158},": the alternative, repository-based data layer",[6496,6497,6498],"style",{},"html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s_MOj, html code.shiki .s_MOj{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sYThS, html code.shiki .sYThS{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .shWJe, html code.shiki .shWJe{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}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 .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sKvfc, html code.shiki .sKvfc{--shiki-light:#E2931D;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sANao, html code.shiki .sANao{--shiki-light:#39ADB5;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .s91G_, html code.shiki .s91G_{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .sv8o3, html code.shiki .sv8o3{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#F8F8F2}html pre.shiki code .seZir, html code.shiki .seZir{--shiki-light:#90A4AE;--shiki-light-font-style:inherit;--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sW3Pz, html code.shiki .sW3Pz{--shiki-light:#E2931D;--shiki-light-font-style:inherit;--shiki-light-text-decoration:inherit;--shiki-default:#6F42C1;--shiki-default-font-style:inherit;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-font-style:inherit;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-font-style:italic;--shiki-sepia-text-decoration:underline}html pre.shiki code .sMTiH, html code.shiki .sMTiH{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sRxSC, html code.shiki .sRxSC{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#F92672;--shiki-sepia-font-style:inherit}html pre.shiki code .sQqfL, html code.shiki .sQqfL{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sMLJd, html code.shiki .sMLJd{--shiki-light:#6182B8;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sSBr1, html code.shiki .sSBr1{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html pre.shiki code .sqxi8, html code.shiki .sqxi8{--shiki-light:#90A4AE;--shiki-light-font-weight:inherit;--shiki-default:#22863A;--shiki-default-font-weight:bold;--shiki-dark:#85E89D;--shiki-dark-font-weight:bold;--shiki-sepia:#AE81FF;--shiki-sepia-font-weight:inherit}",{"title":324,"searchDepth":331,"depth":373,"links":6500},[6501,6505,6508,6511,6512,6513,6516,6517,6518,6519,6520,6521],{"id":559,"depth":373,"text":560,"children":6502},[6503,6504],{"id":1243,"depth":436,"text":1244},{"id":1281,"depth":436,"text":1282},{"id":1436,"depth":373,"text":1437,"children":6506},[6507],{"id":1876,"depth":436,"text":1877},{"id":2072,"depth":373,"text":2073,"children":6509},[6510],{"id":2535,"depth":436,"text":2536},{"id":2741,"depth":373,"text":2742},{"id":3323,"depth":373,"text":3324},{"id":3688,"depth":373,"text":3689,"children":6514},[6515],{"id":4446,"depth":436,"text":4447},{"id":4746,"depth":373,"text":4747},{"id":5306,"depth":373,"text":5307},{"id":5702,"depth":373,"text":5703},{"id":6128,"depth":373,"text":6129},{"id":6443,"depth":373,"text":6444},{"id":6471,"depth":373,"text":6472},"[object Object]","md",null,{},{"title":65,"description":6527},{"Active-record models on top of the query builder":6528},"attributes, casts, relationships, eager loading, scopes, events and N+1 detection","HxT2ks3CBt3YrrJxSkCzKSqnnwb4PEoWyz9rUX1PgVs",[6531,6533],{"title":61,"path":62,"stem":63,"description":6532,"children":-1},"Versioned, testable database schema changes",{"title":74,"path":70,"stem":75,"description":6534,"children":-1},"Powerful built-in features for modern applications",1793709783805]