[{"data":1,"prerenderedAt":3304},["ShallowReactive",2],{"navigation":3,"\u002Fresources\u002Frelations":307,"\u002Fresources\u002Frelations-surround":3299},{"3.x":4,"2.x":203},[5,32,61,99,121,147,165],{"title":6,"icon":7,"path":8,"stem":9,"children":10,"page":31},"Getting Started","i-heroicons-star","\u002Fgetting-started","1.getting-started",[11,15,19,23,27],{"title":12,"path":13,"stem":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":16,"path":17,"stem":18},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":20,"path":21,"stem":22},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":24,"path":25,"stem":26},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F4.configuration",{"title":28,"path":29,"stem":30},"Upgrade guide","\u002Fgetting-started\u002Fupgrade-guide","1.getting-started\u002F5.upgrade-guide",false,{"title":33,"icon":34,"path":35,"stem":36,"children":37,"page":31},"Resources","i-heroicons-document-text","\u002Fresources","2.resources",[38,41,45,49,53,57],{"title":33,"path":39,"stem":40},"\u002Fresources\u002Fresources","2.resources\u002F1.resources",{"title":42,"path":43,"stem":44},"Fields","\u002Fresources\u002Ffields","2.resources\u002F2.fields",{"title":46,"path":47,"stem":48},"Relationships","\u002Fresources\u002Frelations","2.resources\u002F3.relations",{"title":50,"path":51,"stem":52},"Validation","\u002Fresources\u002Fvalidation","2.resources\u002F4.validation",{"title":54,"path":55,"stem":56},"Perimeter","\u002Fresources\u002Fperimeter","2.resources\u002F5.perimeter",{"title":58,"path":59,"stem":60},"Limits","\u002Fresources\u002Flimits","2.resources\u002F6.limits",{"title":62,"icon":63,"path":64,"stem":65,"children":66,"page":31},"Search","i-heroicons-magnifying-glass","\u002Fsearch","3.search",[67,71,75,79,83,87,91,95],{"title":68,"path":69,"stem":70},"Search overview","\u002Fsearch\u002Foverview","3.search\u002F1.overview",{"title":72,"path":73,"stem":74},"Search filters","\u002Fsearch\u002Ffilters","3.search\u002F2.filters",{"title":76,"path":77,"stem":78},"Sorts and selects","\u002Fsearch\u002Fsorts-and-selects","3.search\u002F3.sorts-and-selects",{"title":80,"path":81,"stem":82},"Includes and aggregates","\u002Fsearch\u002Fincludes-and-aggregates","3.search\u002F4.includes-and-aggregates",{"title":84,"path":85,"stem":86},"Scopes and instructions","\u002Fsearch\u002Fscopes-and-instructions","3.search\u002F5.scopes-and-instructions",{"title":88,"path":89,"stem":90},"Text search","\u002Fsearch\u002Ftext-search","3.search\u002F6.text-search",{"title":92,"path":93,"stem":94},"Search engines","\u002Fsearch\u002Fsearch-engines","3.search\u002F7.search-engines",{"title":96,"path":97,"stem":98},"Searching outside HTTP","\u002Fsearch\u002Foutside-http","3.search\u002F8.outside-http",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":31},"Writing","i-heroicons-pencil-square","\u002Fwriting","4.writing",[105,109,113,117],{"title":106,"path":107,"stem":108},"Mutate","\u002Fwriting\u002Fmutate","4.writing\u002F1.mutate",{"title":110,"path":111,"stem":112},"Writing relations","\u002Fwriting\u002Frelations","4.writing\u002F2.relations",{"title":114,"path":115,"stem":116},"Versioned rows","\u002Fwriting\u002Fversioned-rows","4.writing\u002F3.versioned-rows",{"title":118,"path":119,"stem":120},"Deleting and restoring","\u002Fwriting\u002Fdeleting","4.writing\u002F4.deleting",{"title":122,"icon":123,"path":124,"stem":125,"children":126,"page":31},"Actions and Metrics","i-heroicons-bolt","\u002Factions-and-metrics","5.actions-and-metrics",[127,131,135,139,143],{"title":128,"path":129,"stem":130},"Actions","\u002Factions-and-metrics\u002Factions","5.actions-and-metrics\u002F1.actions",{"title":132,"path":133,"stem":134},"Queued Actions","\u002Factions-and-metrics\u002Fqueued-actions","5.actions-and-metrics\u002F2.queued-actions",{"title":136,"path":137,"stem":138},"Confirmation","\u002Factions-and-metrics\u002Fconfirmation","5.actions-and-metrics\u002F3.confirmation",{"title":140,"path":141,"stem":142},"Metrics","\u002Factions-and-metrics\u002Fmetrics","5.actions-and-metrics\u002F4.metrics",{"title":144,"path":145,"stem":146},"Exports","\u002Factions-and-metrics\u002Fexports","5.actions-and-metrics\u002F5.exports",{"title":148,"icon":149,"path":150,"stem":151,"children":152,"page":31},"Authorization","i-heroicons-lock-closed","\u002Fauthorization","6.authorization",[153,157,161],{"title":154,"path":155,"stem":156},"Policies","\u002Fauthorization\u002Fpolicies","6.authorization\u002F1.policies",{"title":158,"path":159,"stem":160},"Gates","\u002Fauthorization\u002Fgates","6.authorization\u002F2.gates",{"title":162,"path":163,"stem":164},"Decision Cache","\u002Fauthorization\u002Fdecision-cache","6.authorization\u002F3.decision-cache",{"title":166,"icon":167,"path":168,"stem":169,"children":170,"page":31},"Digging Deeper","i-heroicons-list-bullet","\u002Fdigging-deeper","7.digging-deeper",[171,175,179,183,187,191,195,199],{"title":172,"path":173,"stem":174},"Details","\u002Fdigging-deeper\u002Fdetails","7.digging-deeper\u002F1.details",{"title":176,"path":177,"stem":178},"Events and Hooks","\u002Fdigging-deeper\u002Fevents-and-hooks","7.digging-deeper\u002F2.events-and-hooks",{"title":180,"path":181,"stem":182},"Custom Responses","\u002Fdigging-deeper\u002Fresponses","7.digging-deeper\u002F3.responses",{"title":184,"path":185,"stem":186},"OpenAPI Documentation","\u002Fdigging-deeper\u002Fopenapi","7.digging-deeper\u002F4.openapi",{"title":188,"path":189,"stem":190},"Precognition","\u002Fdigging-deeper\u002Fprecognition","7.digging-deeper\u002F5.precognition",{"title":192,"path":193,"stem":194},"Artisan Commands","\u002Fdigging-deeper\u002Fartisan","7.digging-deeper\u002F6.artisan",{"title":196,"path":197,"stem":198},"Laravel Boost Skill","\u002Fdigging-deeper\u002Fai-skill","7.digging-deeper\u002F7.ai-skill",{"title":200,"path":201,"stem":202},"Translations","\u002Fdigging-deeper\u002Ftranslations","7.digging-deeper\u002F8.translations",[204,215,237,260,297],{"title":6,"icon":7,"path":205,"stem":206,"children":207,"page":31},"\u002F2.x\u002Fgetting-started","2.x\u002F1.getting-started",[208,211],{"title":16,"path":209,"stem":210},"\u002F2.x\u002Fgetting-started\u002Finstallation","2.x\u002F1.getting-started\u002F1.installation",{"title":212,"path":213,"stem":214},"Upgrade Guide","\u002F2.x\u002Fgetting-started\u002Fupgrade-guide","2.x\u002F1.getting-started\u002F2.upgrade-guide",{"title":216,"icon":217,"path":218,"stem":219,"children":220,"page":31},"Endpoints","i-heroicons-arrow-uturn-left","\u002F2.x\u002Fendpoints","2.x\u002F2.endpoints",[221,224,227,230,233],{"title":172,"path":222,"stem":223},"\u002F2.x\u002Fendpoints\u002Fdetails","2.x\u002F2.endpoints\u002F1.details",{"title":62,"path":225,"stem":226},"\u002F2.x\u002Fendpoints\u002Fsearch","2.x\u002F2.endpoints\u002F2.search",{"title":106,"path":228,"stem":229},"\u002F2.x\u002Fendpoints\u002Fmutate","2.x\u002F2.endpoints\u002F3.mutate",{"title":128,"path":231,"stem":232},"\u002F2.x\u002Fendpoints\u002Factions","2.x\u002F2.endpoints\u002F4.actions",{"title":234,"path":235,"stem":236},"Delete","\u002F2.x\u002Fendpoints\u002Fdelete","2.x\u002F2.endpoints\u002F5.delete",{"title":33,"icon":34,"path":238,"stem":239,"children":240,"page":31},"\u002F2.x\u002Fresources","2.x\u002F3.resources",[241,245,249,252,256],{"title":242,"path":243,"stem":244},"Basics","\u002F2.x\u002Fresources\u002Fbasics","2.x\u002F3.resources\u002F1.basics",{"title":246,"path":247,"stem":248},"Exposed Data","\u002F2.x\u002Fresources\u002Fexposed-data","2.x\u002F3.resources\u002F2.exposed-data",{"title":46,"path":250,"stem":251},"\u002F2.x\u002Fresources\u002Frelationships","2.x\u002F3.resources\u002F3.relationships",{"title":253,"path":254,"stem":255},"Validations","\u002F2.x\u002Fresources\u002Fvalidations","2.x\u002F3.resources\u002F4.validations",{"title":257,"path":258,"stem":259},"Interactions","\u002F2.x\u002Fresources\u002Finteractions","2.x\u002F3.resources\u002F5.interactions",{"title":166,"icon":167,"path":261,"stem":262,"children":263,"page":31},"\u002F2.x\u002Fdigging-deeper","2.x\u002F4.digging-deeper",[264,267,271,274,278,282,286,290,294],{"title":128,"path":265,"stem":266},"\u002F2.x\u002Fdigging-deeper\u002Factions","2.x\u002F4.digging-deeper\u002F1.actions",{"title":268,"path":269,"stem":270},"Hooks","\u002F2.x\u002Fdigging-deeper\u002Fhooks","2.x\u002F4.digging-deeper\u002F2.hooks",{"title":158,"path":272,"stem":273},"\u002F2.x\u002Fdigging-deeper\u002Fgates","2.x\u002F4.digging-deeper\u002F3.gates",{"title":275,"path":276,"stem":277},"Authorizations","\u002F2.x\u002Fdigging-deeper\u002Fauthorizations","2.x\u002F4.digging-deeper\u002F4.authorizations",{"title":279,"path":280,"stem":281},"Full Text Search","\u002F2.x\u002Fdigging-deeper\u002Ffull-text-search","2.x\u002F4.digging-deeper\u002F5.full-text-search",{"title":283,"path":284,"stem":285},"Instructions","\u002F2.x\u002Fdigging-deeper\u002Finstructions","2.x\u002F4.digging-deeper\u002F6.instructions",{"title":287,"path":288,"stem":289},"Responses","\u002F2.x\u002Fdigging-deeper\u002Fresponses","2.x\u002F4.digging-deeper\u002F7.responses",{"title":291,"path":292,"stem":293},"Documentation","\u002F2.x\u002Fdigging-deeper\u002Fdocumentation","2.x\u002F4.digging-deeper\u002F8.documentation",{"title":188,"path":295,"stem":296},"\u002F2.x\u002Fdigging-deeper\u002Fprecognition","2.x\u002F4.digging-deeper\u002F9.precognition",{"title":298,"icon":299,"path":300,"stem":301,"children":302,"page":31},"Integrations","i-lucide-puzzle","\u002F2.x\u002Fintegrations","2.x\u002F5.integrations",[303],{"title":304,"path":305,"stem":306},"Flutter","\u002F2.x\u002Fintegrations\u002Fflutter","2.x\u002F5.integrations\u002F1.flutter",{"id":308,"title":46,"body":309,"description":3292,"extension":3293,"links":3294,"meta":3295,"navigation":421,"path":47,"seo":3296,"sitemap":3297,"stem":48,"__hash__":3298},"docs3x\u002F2.resources\u002F3.relations.md",{"type":310,"value":311,"toc":3276},"minimark",[312,317,330,570,609,613,884,898,903,914,969,985,989,1003,1156,1168,1172,1175,1280,1295,1299,1308,1363,1370,1479,1483,1633,1640,1644,1652,1722,1729,1769,1800,1905,1950,1959,1963,1972,2236,2239,2328,2403,2407,2410,2485,2529,2538,2684,2690,2698,2702,2708,2775,2858,2886,2890,2908,2946,3094,3123,3127,3144,3254,3272],[313,314,316],"h2",{"id":315},"declaring-relations","Declaring relations",[318,319,320,324,325,329],"p",{},[321,322,323],"code",{},"relations()"," returns the relations that clients may include, filter on, sort on and write. Each relation names the Eloquent relation method of the model and the ",[326,327,328],"strong",{},"resource"," of the related model:",[331,332,337],"pre",{"className":333,"code":334,"language":335,"meta":336,"style":336},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Lomkit\\Rest\\Relations\\BelongsTo;\nuse Lomkit\\Rest\\Relations\\BelongsToMany;\nuse Lomkit\\Rest\\Relations\\HasMany;\n\npublic function relations(): array\n{\n    return [\n        BelongsTo::make('category', CategoryResource::class),\n        HasMany::make('comments', CommentResource::class),\n        BelongsToMany::make('tags', TagResource::class),\n    ];\n}\n","php","",[321,338,339,372,394,416,423,443,449,459,498,528,558,564],{"__ignoreMap":336},[340,341,344,348,352,356,359,361,364,366,369],"span",{"class":342,"line":343},"line",1,[340,345,347],{"class":346},"sbssI","use",[340,349,351],{"class":350},"sTEyZ"," Lomkit",[340,353,355],{"class":354},"sMK4o","\\",[340,357,358],{"class":350},"Rest",[340,360,355],{"class":354},[340,362,363],{"class":350},"Relations",[340,365,355],{"class":354},[340,367,368],{"class":350},"BelongsTo",[340,370,371],{"class":354},";\n",[340,373,375,377,379,381,383,385,387,389,392],{"class":342,"line":374},2,[340,376,347],{"class":346},[340,378,351],{"class":350},[340,380,355],{"class":354},[340,382,358],{"class":350},[340,384,355],{"class":354},[340,386,363],{"class":350},[340,388,355],{"class":354},[340,390,391],{"class":350},"BelongsToMany",[340,393,371],{"class":354},[340,395,397,399,401,403,405,407,409,411,414],{"class":342,"line":396},3,[340,398,347],{"class":346},[340,400,351],{"class":350},[340,402,355],{"class":354},[340,404,358],{"class":350},[340,406,355],{"class":354},[340,408,363],{"class":350},[340,410,355],{"class":354},[340,412,413],{"class":350},"HasMany",[340,415,371],{"class":354},[340,417,419],{"class":342,"line":418},4,[340,420,422],{"emptyLinePlaceholder":421},true,"\n",[340,424,426,430,433,437,440],{"class":342,"line":425},5,[340,427,429],{"class":428},"spNyl","public",[340,431,432],{"class":428}," function",[340,434,436],{"class":435},"s2Zo4"," relations",[340,438,439],{"class":354},"():",[340,441,442],{"class":346}," array\n",[340,444,446],{"class":342,"line":445},6,[340,447,448],{"class":354},"{\n",[340,450,452,456],{"class":342,"line":451},7,[340,453,455],{"class":454},"s7zQu","    return",[340,457,458],{"class":354}," [\n",[340,460,462,466,469,472,475,478,482,484,487,490,492,495],{"class":342,"line":461},8,[340,463,465],{"class":464},"sBMFI","        BelongsTo",[340,467,468],{"class":354},"::",[340,470,471],{"class":435},"make",[340,473,474],{"class":354},"(",[340,476,477],{"class":354},"'",[340,479,481],{"class":480},"sfazB","category",[340,483,477],{"class":354},[340,485,486],{"class":354},",",[340,488,489],{"class":464}," CategoryResource",[340,491,468],{"class":354},[340,493,494],{"class":346},"class",[340,496,497],{"class":354},"),\n",[340,499,501,504,506,508,510,512,515,517,519,522,524,526],{"class":342,"line":500},9,[340,502,503],{"class":464},"        HasMany",[340,505,468],{"class":354},[340,507,471],{"class":435},[340,509,474],{"class":354},[340,511,477],{"class":354},[340,513,514],{"class":480},"comments",[340,516,477],{"class":354},[340,518,486],{"class":354},[340,520,521],{"class":464}," CommentResource",[340,523,468],{"class":354},[340,525,494],{"class":346},[340,527,497],{"class":354},[340,529,531,534,536,538,540,542,545,547,549,552,554,556],{"class":342,"line":530},10,[340,532,533],{"class":464},"        BelongsToMany",[340,535,468],{"class":354},[340,537,471],{"class":435},[340,539,474],{"class":354},[340,541,477],{"class":354},[340,543,544],{"class":480},"tags",[340,546,477],{"class":354},[340,548,486],{"class":354},[340,550,551],{"class":464}," TagResource",[340,553,468],{"class":354},[340,555,494],{"class":346},[340,557,497],{"class":354},[340,559,561],{"class":342,"line":560},11,[340,562,563],{"class":354},"    ];\n",[340,565,567],{"class":342,"line":566},12,[340,568,569],{"class":354},"}\n",[571,572,573,577,584,599],"ul",{},[574,575,576],"li",{},"The first argument is the name of the relation method on the model. The second is a resource class, never a model class.",[574,578,579,580,583],{},"Use the relation classes of ",[321,581,582],{},"Lomkit\\Rest\\Relations",", not the Eloquent ones.",[574,585,586,587,590,591,594,595,598],{},"A relation that the resource does not declare is refused everywhere: in ",[321,588,589],{},"includes",", in filters, in sorts, in aggregates and in ",[321,592,593],{},"relations"," of ",[321,596,597],{},"mutate",".",[574,600,601,602,605,606,598],{},"The related resource applies its own fields, its own ",[321,603,604],{},"perimeterQuery()"," and its own policies to the related rows. See ",[607,608,54],"a",{"href":55},[313,610,612],{"id":611},"relation-types","Relation types",[614,615,616,634],"table",{},[617,618,619],"thead",{},[620,621,622,626,629],"tr",{},[623,624,625],"th",{},"Relation class",[623,627,628],{},"Eloquent relation",[623,630,631,632],{},"Operations in ",[321,633,597],{},[635,636,637,664,694,711,726,741,755,782,798,814,830,852,868],"tbody",{},[620,638,639,644,649],{},[640,641,642],"td",{},[321,643,368],{},[640,645,646],{},[321,647,648],{},"belongsTo",[640,650,651,654,655,654,658,654,661],{},[321,652,653],{},"create",", ",[321,656,657],{},"update",[321,659,660],{},"attach",[321,662,663],{},"detach",[620,665,666,671,676],{},[640,667,668],{},[321,669,670],{},"HasOne",[640,672,673],{},[321,674,675],{},"hasOne",[640,677,678,654,680,654,682,654,684,686,687,690,691],{},[321,679,653],{},[321,681,657],{},[321,683,660],{},[321,685,663],{},", and ",[321,688,689],{},"delete"," with ",[321,692,693],{},"deletable()",[620,695,696,701,706],{},[640,697,698],{},[321,699,700],{},"HasOneOfMany",[640,702,703],{},[321,704,705],{},"hasOne()->ofMany()",[640,707,708,709],{},"same as ",[321,710,670],{},[620,712,713,717,722],{},[640,714,715],{},[321,716,413],{},[640,718,719],{},[321,720,721],{},"hasMany",[640,723,708,724],{},[321,725,670],{},[620,727,728,733,738],{},[640,729,730],{},[321,731,732],{},"HasOneThrough",[640,734,735],{},[321,736,737],{},"hasOneThrough",[640,739,740],{},"none",[620,742,743,748,753],{},[640,744,745],{},[321,746,747],{},"HasManyThrough",[640,749,750],{},[321,751,752],{},"hasManyThrough",[640,754,740],{},[620,756,757,761,766],{},[640,758,759],{},[321,760,391],{},[640,762,763],{},[321,764,765],{},"belongsToMany",[640,767,768,654,770,654,772,654,774,654,776,654,779],{},[321,769,653],{},[321,771,657],{},[321,773,660],{},[321,775,663],{},[321,777,778],{},"sync",[321,780,781],{},"toggle",[620,783,784,789,794],{},[640,785,786],{},[321,787,788],{},"MorphOne",[640,790,791],{},[321,792,793],{},"morphOne",[640,795,708,796],{},[321,797,670],{},[620,799,800,805,810],{},[640,801,802],{},[321,803,804],{},"MorphOneOfMany",[640,806,807],{},[321,808,809],{},"morphOne()->ofMany()",[640,811,708,812],{},[321,813,670],{},[620,815,816,821,826],{},[640,817,818],{},[321,819,820],{},"MorphMany",[640,822,823],{},[321,824,825],{},"morphMany",[640,827,708,828],{},[321,829,670],{},[620,831,832,837,842],{},[640,833,834],{},[321,835,836],{},"MorphTo",[640,838,839],{},[321,840,841],{},"morphTo",[640,843,844,654,846,654,848,654,850],{},[321,845,653],{},[321,847,657],{},[321,849,660],{},[321,851,663],{},[620,853,854,859,864],{},[640,855,856],{},[321,857,858],{},"MorphToMany",[640,860,861],{},[321,862,863],{},"morphToMany",[640,865,708,866],{},[321,867,391],{},[620,869,870,875,880],{},[640,871,872],{},[321,873,874],{},"MorphedByMany",[640,876,877],{},[321,878,879],{},"morphedByMany",[640,881,708,882],{},[321,883,391],{},[318,885,886,887,890,891,894,895,897],{},"The details list the operations of each relation under ",[321,888,889],{},"operations",", with ",[321,892,893],{},"?with=relations.operations",". See ",[607,896,110],{"href":111}," for each operation.",[899,900,902],"h3",{"id":901},"belongs-to","Belongs to",[318,904,905,906,909,910,913],{},"A ",[321,907,908],{},"Product"," belongs to a ",[321,911,912],{},"Category",":",[331,915,917],{"className":333,"code":916,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\BelongsTo;\n\nBelongsTo::make('category', CategoryResource::class),\n",[321,918,919,939,943],{"__ignoreMap":336},[340,920,921,923,925,927,929,931,933,935,937],{"class":342,"line":343},[340,922,347],{"class":346},[340,924,351],{"class":350},[340,926,355],{"class":354},[340,928,358],{"class":350},[340,930,355],{"class":354},[340,932,363],{"class":350},[340,934,355],{"class":354},[340,936,368],{"class":350},[340,938,371],{"class":354},[340,940,941],{"class":342,"line":374},[340,942,422],{"emptyLinePlaceholder":421},[340,944,945,947,949,951,953,955,957,959,961,963,965,967],{"class":342,"line":396},[340,946,368],{"class":464},[340,948,468],{"class":354},[340,950,471],{"class":435},[340,952,474],{"class":354},[340,954,477],{"class":354},[340,956,481],{"class":480},[340,958,477],{"class":354},[340,960,486],{"class":354},[340,962,489],{"class":464},[340,964,468],{"class":354},[340,966,494],{"class":346},[340,968,497],{"class":354},[318,970,905,971,973,974,977,978,981,982,598],{},[321,972,368],{}," include loads the one related row of each parent row: it takes no ",[321,975,976],{},"limit"," and no ",[321,979,980],{},"sorts",". A search can sort on a field of a to-one relation, such as ",[321,983,984],{},"category.name",[899,986,988],{"id":987},"has-one-and-has-many","Has one and has many",[318,990,905,991,994,995,998,999,1002],{},[321,992,993],{},"User"," has one ",[321,996,997],{},"Address"," and many ",[321,1000,1001],{},"Post"," models:",[331,1004,1006],{"className":333,"code":1005,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\HasMany;\nuse Lomkit\\Rest\\Relations\\HasOne;\nuse Lomkit\\Rest\\Relations\\HasOneOfMany;\n\nHasOne::make('address', AddressResource::class),\nHasOneOfMany::make('latestOrder', OrderResource::class),\nHasMany::make('posts', PostResource::class),\n",[321,1007,1008,1028,1048,1068,1072,1100,1128],{"__ignoreMap":336},[340,1009,1010,1012,1014,1016,1018,1020,1022,1024,1026],{"class":342,"line":343},[340,1011,347],{"class":346},[340,1013,351],{"class":350},[340,1015,355],{"class":354},[340,1017,358],{"class":350},[340,1019,355],{"class":354},[340,1021,363],{"class":350},[340,1023,355],{"class":354},[340,1025,413],{"class":350},[340,1027,371],{"class":354},[340,1029,1030,1032,1034,1036,1038,1040,1042,1044,1046],{"class":342,"line":374},[340,1031,347],{"class":346},[340,1033,351],{"class":350},[340,1035,355],{"class":354},[340,1037,358],{"class":350},[340,1039,355],{"class":354},[340,1041,363],{"class":350},[340,1043,355],{"class":354},[340,1045,670],{"class":350},[340,1047,371],{"class":354},[340,1049,1050,1052,1054,1056,1058,1060,1062,1064,1066],{"class":342,"line":396},[340,1051,347],{"class":346},[340,1053,351],{"class":350},[340,1055,355],{"class":354},[340,1057,358],{"class":350},[340,1059,355],{"class":354},[340,1061,363],{"class":350},[340,1063,355],{"class":354},[340,1065,700],{"class":350},[340,1067,371],{"class":354},[340,1069,1070],{"class":342,"line":418},[340,1071,422],{"emptyLinePlaceholder":421},[340,1073,1074,1076,1078,1080,1082,1084,1087,1089,1091,1094,1096,1098],{"class":342,"line":425},[340,1075,670],{"class":464},[340,1077,468],{"class":354},[340,1079,471],{"class":435},[340,1081,474],{"class":354},[340,1083,477],{"class":354},[340,1085,1086],{"class":480},"address",[340,1088,477],{"class":354},[340,1090,486],{"class":354},[340,1092,1093],{"class":464}," AddressResource",[340,1095,468],{"class":354},[340,1097,494],{"class":346},[340,1099,497],{"class":354},[340,1101,1102,1104,1106,1108,1110,1112,1115,1117,1119,1122,1124,1126],{"class":342,"line":445},[340,1103,700],{"class":464},[340,1105,468],{"class":354},[340,1107,471],{"class":435},[340,1109,474],{"class":354},[340,1111,477],{"class":354},[340,1113,1114],{"class":480},"latestOrder",[340,1116,477],{"class":354},[340,1118,486],{"class":354},[340,1120,1121],{"class":464}," OrderResource",[340,1123,468],{"class":354},[340,1125,494],{"class":346},[340,1127,497],{"class":354},[340,1129,1130,1132,1134,1136,1138,1140,1143,1145,1147,1150,1152,1154],{"class":342,"line":451},[340,1131,413],{"class":464},[340,1133,468],{"class":354},[340,1135,471],{"class":435},[340,1137,474],{"class":354},[340,1139,477],{"class":354},[340,1141,1142],{"class":480},"posts",[340,1144,477],{"class":354},[340,1146,486],{"class":354},[340,1148,1149],{"class":464}," PostResource",[340,1151,468],{"class":354},[340,1153,494],{"class":346},[340,1155,497],{"class":354},[318,1157,1158,1159,1161,1162,1165,1166,598],{},"A to-many include returns at most its ",[321,1160,976],{}," rows per parent row, or the ",[321,1163,1164],{},"$includeLimit"," of the related resource. See ",[607,1167,80],{"href":81},[899,1169,1171],{"id":1170},"through-relations","Through relations",[318,1173,1174],{},"A through relation reaches distant rows through an intermediate model, such as the replies of the tickets of a team:",[331,1176,1178],{"className":333,"code":1177,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\HasManyThrough;\nuse Lomkit\\Rest\\Relations\\HasOneThrough;\n\nHasOneThrough::make('car', CarResource::class),\nHasManyThrough::make('replies', ReplyResource::class),\n",[321,1179,1180,1200,1220,1224,1252],{"__ignoreMap":336},[340,1181,1182,1184,1186,1188,1190,1192,1194,1196,1198],{"class":342,"line":343},[340,1183,347],{"class":346},[340,1185,351],{"class":350},[340,1187,355],{"class":354},[340,1189,358],{"class":350},[340,1191,355],{"class":354},[340,1193,363],{"class":350},[340,1195,355],{"class":354},[340,1197,747],{"class":350},[340,1199,371],{"class":354},[340,1201,1202,1204,1206,1208,1210,1212,1214,1216,1218],{"class":342,"line":374},[340,1203,347],{"class":346},[340,1205,351],{"class":350},[340,1207,355],{"class":354},[340,1209,358],{"class":350},[340,1211,355],{"class":354},[340,1213,363],{"class":350},[340,1215,355],{"class":354},[340,1217,732],{"class":350},[340,1219,371],{"class":354},[340,1221,1222],{"class":342,"line":396},[340,1223,422],{"emptyLinePlaceholder":421},[340,1225,1226,1228,1230,1232,1234,1236,1239,1241,1243,1246,1248,1250],{"class":342,"line":418},[340,1227,732],{"class":464},[340,1229,468],{"class":354},[340,1231,471],{"class":435},[340,1233,474],{"class":354},[340,1235,477],{"class":354},[340,1237,1238],{"class":480},"car",[340,1240,477],{"class":354},[340,1242,486],{"class":354},[340,1244,1245],{"class":464}," CarResource",[340,1247,468],{"class":354},[340,1249,494],{"class":346},[340,1251,497],{"class":354},[340,1253,1254,1256,1258,1260,1262,1264,1267,1269,1271,1274,1276,1278],{"class":342,"line":425},[340,1255,747],{"class":464},[340,1257,468],{"class":354},[340,1259,471],{"class":435},[340,1261,474],{"class":354},[340,1263,477],{"class":354},[340,1265,1266],{"class":480},"replies",[340,1268,477],{"class":354},[340,1270,486],{"class":354},[340,1272,1273],{"class":464}," ReplyResource",[340,1275,468],{"class":354},[340,1277,494],{"class":346},[340,1279,497],{"class":354},[318,1281,1282,1284,1285,1287,1288,1290,1291,1294],{},[321,1283,732],{}," and ",[321,1286,747],{}," can be included, filtered and aggregated, but not written. They accept no operation, and ",[321,1289,597],{}," refuses any entry under them as a whole: ",[321,1292,1293],{},"The mutate.0.relations.replies field is prohibited."," Write the distant rows through the intermediate relations instead.",[899,1296,1298],{"id":1297},"many-to-many","Many to many",[318,1300,905,1301,1303,1304,1307],{},[321,1302,1001],{}," belongs to many ",[321,1305,1306],{},"Tag"," models, through a pivot table:",[331,1309,1311],{"className":333,"code":1310,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\BelongsToMany;\n\nBelongsToMany::make('tags', TagResource::class),\n",[321,1312,1313,1333,1337],{"__ignoreMap":336},[340,1314,1315,1317,1319,1321,1323,1325,1327,1329,1331],{"class":342,"line":343},[340,1316,347],{"class":346},[340,1318,351],{"class":350},[340,1320,355],{"class":354},[340,1322,358],{"class":350},[340,1324,355],{"class":354},[340,1326,363],{"class":350},[340,1328,355],{"class":354},[340,1330,391],{"class":350},[340,1332,371],{"class":354},[340,1334,1335],{"class":342,"line":374},[340,1336,422],{"emptyLinePlaceholder":421},[340,1338,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361],{"class":342,"line":396},[340,1340,391],{"class":464},[340,1342,468],{"class":354},[340,1344,471],{"class":435},[340,1346,474],{"class":354},[340,1348,477],{"class":354},[340,1350,544],{"class":480},[340,1352,477],{"class":354},[340,1354,486],{"class":354},[340,1356,551],{"class":464},[340,1358,468],{"class":354},[340,1360,494],{"class":346},[340,1362,497],{"class":354},[318,1364,1365,1284,1367,1369],{},[321,1366,858],{},[321,1368,874],{}," declare the polymorphic forms, and its inverse:",[331,1371,1373],{"className":333,"code":1372,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\MorphedByMany;\nuse Lomkit\\Rest\\Relations\\MorphToMany;\n\nMorphToMany::make('tags', TagResource::class),        \u002F\u002F on PostResource\nMorphedByMany::make('posts', PostResource::class),    \u002F\u002F on TagResource\n",[321,1374,1375,1395,1415,1419,1450],{"__ignoreMap":336},[340,1376,1377,1379,1381,1383,1385,1387,1389,1391,1393],{"class":342,"line":343},[340,1378,347],{"class":346},[340,1380,351],{"class":350},[340,1382,355],{"class":354},[340,1384,358],{"class":350},[340,1386,355],{"class":354},[340,1388,363],{"class":350},[340,1390,355],{"class":354},[340,1392,874],{"class":350},[340,1394,371],{"class":354},[340,1396,1397,1399,1401,1403,1405,1407,1409,1411,1413],{"class":342,"line":374},[340,1398,347],{"class":346},[340,1400,351],{"class":350},[340,1402,355],{"class":354},[340,1404,358],{"class":350},[340,1406,355],{"class":354},[340,1408,363],{"class":350},[340,1410,355],{"class":354},[340,1412,858],{"class":350},[340,1414,371],{"class":354},[340,1416,1417],{"class":342,"line":396},[340,1418,422],{"emptyLinePlaceholder":421},[340,1420,1421,1423,1425,1427,1429,1431,1433,1435,1437,1439,1441,1443,1446],{"class":342,"line":418},[340,1422,858],{"class":464},[340,1424,468],{"class":354},[340,1426,471],{"class":435},[340,1428,474],{"class":354},[340,1430,477],{"class":354},[340,1432,544],{"class":480},[340,1434,477],{"class":354},[340,1436,486],{"class":354},[340,1438,551],{"class":464},[340,1440,468],{"class":354},[340,1442,494],{"class":346},[340,1444,1445],{"class":354},"),",[340,1447,1449],{"class":1448},"sHwdD","        \u002F\u002F on PostResource\n",[340,1451,1452,1454,1456,1458,1460,1462,1464,1466,1468,1470,1472,1474,1476],{"class":342,"line":425},[340,1453,874],{"class":464},[340,1455,468],{"class":354},[340,1457,471],{"class":435},[340,1459,474],{"class":354},[340,1461,477],{"class":354},[340,1463,1142],{"class":480},[340,1465,477],{"class":354},[340,1467,486],{"class":354},[340,1469,1149],{"class":464},[340,1471,468],{"class":354},[340,1473,494],{"class":346},[340,1475,1445],{"class":354},[340,1477,1478],{"class":1448},"    \u002F\u002F on TagResource\n",[899,1480,1482],{"id":1481},"morph-one-and-morph-many","Morph one and morph many",[331,1484,1486],{"className":333,"code":1485,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\MorphMany;\nuse Lomkit\\Rest\\Relations\\MorphOne;\nuse Lomkit\\Rest\\Relations\\MorphOneOfMany;\n\nMorphOne::make('image', ImageResource::class),\nMorphOneOfMany::make('latestImage', ImageResource::class),\nMorphMany::make('comments', CommentResource::class),\n",[321,1487,1488,1508,1528,1548,1552,1580,1607],{"__ignoreMap":336},[340,1489,1490,1492,1494,1496,1498,1500,1502,1504,1506],{"class":342,"line":343},[340,1491,347],{"class":346},[340,1493,351],{"class":350},[340,1495,355],{"class":354},[340,1497,358],{"class":350},[340,1499,355],{"class":354},[340,1501,363],{"class":350},[340,1503,355],{"class":354},[340,1505,820],{"class":350},[340,1507,371],{"class":354},[340,1509,1510,1512,1514,1516,1518,1520,1522,1524,1526],{"class":342,"line":374},[340,1511,347],{"class":346},[340,1513,351],{"class":350},[340,1515,355],{"class":354},[340,1517,358],{"class":350},[340,1519,355],{"class":354},[340,1521,363],{"class":350},[340,1523,355],{"class":354},[340,1525,788],{"class":350},[340,1527,371],{"class":354},[340,1529,1530,1532,1534,1536,1538,1540,1542,1544,1546],{"class":342,"line":396},[340,1531,347],{"class":346},[340,1533,351],{"class":350},[340,1535,355],{"class":354},[340,1537,358],{"class":350},[340,1539,355],{"class":354},[340,1541,363],{"class":350},[340,1543,355],{"class":354},[340,1545,804],{"class":350},[340,1547,371],{"class":354},[340,1549,1550],{"class":342,"line":418},[340,1551,422],{"emptyLinePlaceholder":421},[340,1553,1554,1556,1558,1560,1562,1564,1567,1569,1571,1574,1576,1578],{"class":342,"line":425},[340,1555,788],{"class":464},[340,1557,468],{"class":354},[340,1559,471],{"class":435},[340,1561,474],{"class":354},[340,1563,477],{"class":354},[340,1565,1566],{"class":480},"image",[340,1568,477],{"class":354},[340,1570,486],{"class":354},[340,1572,1573],{"class":464}," ImageResource",[340,1575,468],{"class":354},[340,1577,494],{"class":346},[340,1579,497],{"class":354},[340,1581,1582,1584,1586,1588,1590,1592,1595,1597,1599,1601,1603,1605],{"class":342,"line":445},[340,1583,804],{"class":464},[340,1585,468],{"class":354},[340,1587,471],{"class":435},[340,1589,474],{"class":354},[340,1591,477],{"class":354},[340,1593,1594],{"class":480},"latestImage",[340,1596,477],{"class":354},[340,1598,486],{"class":354},[340,1600,1573],{"class":464},[340,1602,468],{"class":354},[340,1604,494],{"class":346},[340,1606,497],{"class":354},[340,1608,1609,1611,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631],{"class":342,"line":451},[340,1610,820],{"class":464},[340,1612,468],{"class":354},[340,1614,471],{"class":435},[340,1616,474],{"class":354},[340,1618,477],{"class":354},[340,1620,514],{"class":480},[340,1622,477],{"class":354},[340,1624,486],{"class":354},[340,1626,521],{"class":464},[340,1628,468],{"class":354},[340,1630,494],{"class":346},[340,1632,497],{"class":354},[318,1634,1635,1636,1639],{},"These relations write the morph type with ",[321,1637,1638],{},"getMorphClass()",": with a morph map, they write the alias.",[899,1641,1643],{"id":1642},"morph-to","Morph to",[318,1645,905,1646,1648,1649,913],{},[321,1647,836],{}," declares every resource that it can load, its ",[326,1650,1651],{},"targets",[331,1653,1655],{"className":333,"code":1654,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\MorphTo;\n\nMorphTo::make('labelable', [BookResource::class, ShelfResource::class]),\n",[321,1656,1657,1677,1681],{"__ignoreMap":336},[340,1658,1659,1661,1663,1665,1667,1669,1671,1673,1675],{"class":342,"line":343},[340,1660,347],{"class":346},[340,1662,351],{"class":350},[340,1664,355],{"class":354},[340,1666,358],{"class":350},[340,1668,355],{"class":354},[340,1670,363],{"class":350},[340,1672,355],{"class":354},[340,1674,836],{"class":350},[340,1676,371],{"class":354},[340,1678,1679],{"class":342,"line":374},[340,1680,422],{"emptyLinePlaceholder":421},[340,1682,1683,1685,1687,1689,1691,1693,1696,1698,1700,1703,1706,1708,1710,1712,1715,1717,1719],{"class":342,"line":396},[340,1684,836],{"class":464},[340,1686,468],{"class":354},[340,1688,471],{"class":435},[340,1690,474],{"class":354},[340,1692,477],{"class":354},[340,1694,1695],{"class":480},"labelable",[340,1697,477],{"class":354},[340,1699,486],{"class":354},[340,1701,1702],{"class":354}," [",[340,1704,1705],{"class":464},"BookResource",[340,1707,468],{"class":354},[340,1709,494],{"class":346},[340,1711,486],{"class":354},[340,1713,1714],{"class":464}," ShelfResource",[340,1716,468],{"class":354},[340,1718,494],{"class":346},[340,1720,1721],{"class":354},"]),\n",[318,1723,1724,1725,1728],{},"The model keeps one ",[321,1726,1727],{},"morphTo()"," method:",[331,1730,1733],{"className":333,"code":1731,"filename":1732,"language":335,"meta":336,"style":336},"public function labelable(): MorphTo\n{\n    return $this->morphTo();\n}\n","app\u002FModels\u002FLabel.php",[321,1734,1735,1749,1753,1765],{"__ignoreMap":336},[340,1736,1737,1739,1741,1744,1746],{"class":342,"line":343},[340,1738,429],{"class":428},[340,1740,432],{"class":428},[340,1742,1743],{"class":435}," labelable",[340,1745,439],{"class":354},[340,1747,1748],{"class":464}," MorphTo\n",[340,1750,1751],{"class":342,"line":374},[340,1752,448],{"class":354},[340,1754,1755,1757,1760,1762],{"class":342,"line":396},[340,1756,455],{"class":454},[340,1758,1759],{"class":354}," $this->",[340,1761,841],{"class":435},[340,1763,1764],{"class":354},"();\n",[340,1766,1767],{"class":342,"line":418},[340,1768,569],{"class":354},[571,1770,1771,1777,1783],{},[574,1772,1773,1774,1776],{},"Each target is keyed by its morph type, the ",[321,1775,1638],{}," of its model: the morph-map alias, or the class name without a map. A morph map is recommended.",[574,1778,1779,1780,598],{},"A declaration with one resource is the one-target case: ",[321,1781,1782],{},"MorphTo::make('commentable', PostResource::class)",[574,1784,1785,1786,1788,1789,1792,1793,1796,1797,598],{},"Each row that a ",[321,1787,836],{}," include returns starts with its type, under the ",[321,1790,1791],{},"@type"," key, which ",[321,1794,1795],{},"morph.type_key"," renames in ",[321,1798,1799],{},"config\u002Frest.php",[331,1801,1805],{"className":1802,"code":1803,"language":1804,"meta":336,"style":336},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\"id\": 1, \"text\": \"classic\", \"labelable\": {\"@type\": \"book\", \"id\": 1, \"title\": \"Dune\"}}\n","json",[321,1806,1807],{"__ignoreMap":336},[340,1808,1809,1812,1815,1818,1820,1822,1825,1827,1830,1833,1835,1837,1839,1842,1844,1846,1848,1850,1852,1854,1857,1859,1861,1863,1865,1867,1870,1872,1874,1876,1878,1880,1882,1884,1886,1888,1891,1893,1895,1897,1900,1902],{"class":342,"line":343},[340,1810,1811],{"class":354},"{",[340,1813,1814],{"class":354},"\"",[340,1816,1817],{"class":428},"id",[340,1819,1814],{"class":354},[340,1821,913],{"class":354},[340,1823,1824],{"class":346}," 1",[340,1826,486],{"class":354},[340,1828,1829],{"class":354}," \"",[340,1831,1832],{"class":428},"text",[340,1834,1814],{"class":354},[340,1836,913],{"class":354},[340,1838,1829],{"class":354},[340,1840,1841],{"class":480},"classic",[340,1843,1814],{"class":354},[340,1845,486],{"class":354},[340,1847,1829],{"class":354},[340,1849,1695],{"class":428},[340,1851,1814],{"class":354},[340,1853,913],{"class":354},[340,1855,1856],{"class":354}," {",[340,1858,1814],{"class":354},[340,1860,1791],{"class":464},[340,1862,1814],{"class":354},[340,1864,913],{"class":354},[340,1866,1829],{"class":354},[340,1868,1869],{"class":480},"book",[340,1871,1814],{"class":354},[340,1873,486],{"class":354},[340,1875,1829],{"class":354},[340,1877,1817],{"class":464},[340,1879,1814],{"class":354},[340,1881,913],{"class":354},[340,1883,1824],{"class":346},[340,1885,486],{"class":354},[340,1887,1829],{"class":354},[340,1889,1890],{"class":464},"title",[340,1892,1814],{"class":354},[340,1894,913],{"class":354},[340,1896,1829],{"class":354},[340,1898,1899],{"class":480},"Dune",[340,1901,1814],{"class":354},[340,1903,1904],{"class":354},"}}\n",[571,1906,1907,1914,1934],{},[574,1908,1909,1910,1913],{},"A row whose stored type is not a target of the relation returns ",[321,1911,1912],{},"null"," for the include.",[574,1915,1916,1917,1919,1920,1923,1924,1926,1927,977,1929,1931,1932,598],{},"An include of a ",[321,1918,836],{}," with several targets sets its search for each type under ",[321,1921,1922],{},"types",". A ",[321,1925,836],{}," include takes no ",[321,1928,976],{},[321,1930,980],{},", and an aggregate cannot go through it. See ",[607,1933,80],{"href":81},[574,1935,905,1936,1938,1939,1941,1942,1945,1946,1949],{},[321,1937,836],{}," entry in ",[321,1940,597],{}," sends ",[321,1943,1944],{},"type",", the morph type of its target: ",[321,1947,1948],{},"{\"operation\": \"attach\", \"type\": \"shelf\", \"key\": 2}",". It is required with several targets.",[1951,1952,1953],"note",{},[318,1954,1955,1956,598],{},"Adding a morph map to an existing application needs the stored types migrated, because a stored class name no longer matches an alias: ",[321,1957,1958],{},"UPDATE labels SET labelable_type = 'book' WHERE labelable_type = 'App\\\\Models\\\\Book'",[313,1960,1962],{"id":1961},"pivot-fields","Pivot fields",[318,1964,1965,654,1967,1284,1969,1971],{},[321,1966,391],{},[321,1968,858],{},[321,1970,874],{}," declare the columns of their pivot table with typed fields. Each pivot field decides which operations write its column, validates the value, and decides whether the value is returned:",[331,1973,1975],{"className":333,"code":1974,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Fields\\DateTime;\nuse Lomkit\\Rest\\Fields\\Integer;\nuse Lomkit\\Rest\\Fields\\Text;\nuse Lomkit\\Rest\\Relations\\BelongsToMany;\n\nBelongsToMany::make('tags', TagResource::class)->pivotFields([\n    Integer::make('weight')\n        ->nullable()\n        ->rules('min:0'),\n    Text::make('added_by')->updatable(false),     \u002F\u002F written on create and attach only\n    Text::make('note')->writeOnly(),              \u002F\u002F written, never returned\n    DateTime::make('created_at')->readonly(),     \u002F\u002F returned, never written\n]),\n",[321,1976,1977,1998,2019,2040,2060,2064,2097,2118,2129,2147,2176,2203,2231],{"__ignoreMap":336},[340,1978,1979,1981,1983,1985,1987,1989,1991,1993,1996],{"class":342,"line":343},[340,1980,347],{"class":346},[340,1982,351],{"class":350},[340,1984,355],{"class":354},[340,1986,358],{"class":350},[340,1988,355],{"class":354},[340,1990,42],{"class":350},[340,1992,355],{"class":354},[340,1994,1995],{"class":350},"DateTime",[340,1997,371],{"class":354},[340,1999,2000,2002,2004,2006,2008,2010,2012,2014,2017],{"class":342,"line":374},[340,2001,347],{"class":346},[340,2003,351],{"class":350},[340,2005,355],{"class":354},[340,2007,358],{"class":350},[340,2009,355],{"class":354},[340,2011,42],{"class":350},[340,2013,355],{"class":354},[340,2015,2016],{"class":350},"Integer",[340,2018,371],{"class":354},[340,2020,2021,2023,2025,2027,2029,2031,2033,2035,2038],{"class":342,"line":396},[340,2022,347],{"class":346},[340,2024,351],{"class":350},[340,2026,355],{"class":354},[340,2028,358],{"class":350},[340,2030,355],{"class":354},[340,2032,42],{"class":350},[340,2034,355],{"class":354},[340,2036,2037],{"class":350},"Text",[340,2039,371],{"class":354},[340,2041,2042,2044,2046,2048,2050,2052,2054,2056,2058],{"class":342,"line":418},[340,2043,347],{"class":346},[340,2045,351],{"class":350},[340,2047,355],{"class":354},[340,2049,358],{"class":350},[340,2051,355],{"class":354},[340,2053,363],{"class":350},[340,2055,355],{"class":354},[340,2057,391],{"class":350},[340,2059,371],{"class":354},[340,2061,2062],{"class":342,"line":425},[340,2063,422],{"emptyLinePlaceholder":421},[340,2065,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2091,2094],{"class":342,"line":445},[340,2067,391],{"class":464},[340,2069,468],{"class":354},[340,2071,471],{"class":435},[340,2073,474],{"class":354},[340,2075,477],{"class":354},[340,2077,544],{"class":480},[340,2079,477],{"class":354},[340,2081,486],{"class":354},[340,2083,551],{"class":464},[340,2085,468],{"class":354},[340,2087,494],{"class":346},[340,2089,2090],{"class":354},")->",[340,2092,2093],{"class":435},"pivotFields",[340,2095,2096],{"class":354},"([\n",[340,2098,2099,2102,2104,2106,2108,2110,2113,2115],{"class":342,"line":451},[340,2100,2101],{"class":464},"    Integer",[340,2103,468],{"class":354},[340,2105,471],{"class":435},[340,2107,474],{"class":354},[340,2109,477],{"class":354},[340,2111,2112],{"class":480},"weight",[340,2114,477],{"class":354},[340,2116,2117],{"class":354},")\n",[340,2119,2120,2123,2126],{"class":342,"line":461},[340,2121,2122],{"class":354},"        ->",[340,2124,2125],{"class":435},"nullable",[340,2127,2128],{"class":354},"()\n",[340,2130,2131,2133,2136,2138,2140,2143,2145],{"class":342,"line":500},[340,2132,2122],{"class":354},[340,2134,2135],{"class":435},"rules",[340,2137,474],{"class":354},[340,2139,477],{"class":354},[340,2141,2142],{"class":480},"min:0",[340,2144,477],{"class":354},[340,2146,497],{"class":354},[340,2148,2149,2152,2154,2156,2158,2160,2163,2165,2167,2170,2173],{"class":342,"line":530},[340,2150,2151],{"class":464},"    Text",[340,2153,468],{"class":354},[340,2155,471],{"class":435},[340,2157,474],{"class":354},[340,2159,477],{"class":354},[340,2161,2162],{"class":480},"added_by",[340,2164,477],{"class":354},[340,2166,2090],{"class":354},[340,2168,2169],{"class":435},"updatable",[340,2171,2172],{"class":354},"(false),",[340,2174,2175],{"class":1448},"     \u002F\u002F written on create and attach only\n",[340,2177,2178,2180,2182,2184,2186,2188,2190,2192,2194,2197,2200],{"class":342,"line":560},[340,2179,2151],{"class":464},[340,2181,468],{"class":354},[340,2183,471],{"class":435},[340,2185,474],{"class":354},[340,2187,477],{"class":354},[340,2189,1951],{"class":480},[340,2191,477],{"class":354},[340,2193,2090],{"class":354},[340,2195,2196],{"class":435},"writeOnly",[340,2198,2199],{"class":354},"(),",[340,2201,2202],{"class":1448},"              \u002F\u002F written, never returned\n",[340,2204,2205,2208,2210,2212,2214,2216,2219,2221,2223,2226,2228],{"class":342,"line":566},[340,2206,2207],{"class":464},"    DateTime",[340,2209,468],{"class":354},[340,2211,471],{"class":435},[340,2213,474],{"class":354},[340,2215,477],{"class":354},[340,2217,2218],{"class":480},"created_at",[340,2220,477],{"class":354},[340,2222,2090],{"class":354},[340,2224,2225],{"class":435},"readonly",[340,2227,2199],{"class":354},[340,2229,2230],{"class":1448},"     \u002F\u002F returned, never written\n",[340,2232,2234],{"class":342,"line":2233},13,[340,2235,1721],{"class":354},[318,2237,2238],{},"Declare the same columns on the Eloquent relation, so that Eloquent reads them:",[331,2240,2243],{"className":333,"code":2241,"filename":2242,"language":335,"meta":336,"style":336},"public function tags(): BelongsToMany\n{\n    return $this->belongsToMany(Tag::class)\n        ->withPivot('weight', 'added_by', 'note')\n        ->withTimestamps();\n}\n","app\u002FModels\u002FPost.php",[321,2244,2245,2259,2263,2281,2315,2324],{"__ignoreMap":336},[340,2246,2247,2249,2251,2254,2256],{"class":342,"line":343},[340,2248,429],{"class":428},[340,2250,432],{"class":428},[340,2252,2253],{"class":435}," tags",[340,2255,439],{"class":354},[340,2257,2258],{"class":464}," BelongsToMany\n",[340,2260,2261],{"class":342,"line":374},[340,2262,448],{"class":354},[340,2264,2265,2267,2269,2271,2273,2275,2277,2279],{"class":342,"line":396},[340,2266,455],{"class":454},[340,2268,1759],{"class":354},[340,2270,765],{"class":435},[340,2272,474],{"class":354},[340,2274,1306],{"class":464},[340,2276,468],{"class":354},[340,2278,494],{"class":346},[340,2280,2117],{"class":354},[340,2282,2283,2285,2288,2290,2292,2294,2296,2298,2301,2303,2305,2307,2309,2311,2313],{"class":342,"line":418},[340,2284,2122],{"class":354},[340,2286,2287],{"class":435},"withPivot",[340,2289,474],{"class":354},[340,2291,477],{"class":354},[340,2293,2112],{"class":480},[340,2295,477],{"class":354},[340,2297,486],{"class":354},[340,2299,2300],{"class":354}," '",[340,2302,2162],{"class":480},[340,2304,477],{"class":354},[340,2306,486],{"class":354},[340,2308,2300],{"class":354},[340,2310,1951],{"class":480},[340,2312,477],{"class":354},[340,2314,2117],{"class":354},[340,2316,2317,2319,2322],{"class":342,"line":425},[340,2318,2122],{"class":354},[340,2320,2321],{"class":435},"withTimestamps",[340,2323,1764],{"class":354},[340,2325,2326],{"class":342,"line":445},[340,2327,569],{"class":354},[571,2329,2330,2357,2363,2370,2388],{},[574,2331,2332,1284,2334,2336,2337,2340,2341,654,2343,1284,2345,2347,2348,2340,2351,2353,2354,598],{},[321,2333,653],{},[321,2335,660],{}," accept the creatable pivot fields with their ",[321,2338,2339],{},"creationRules()",". ",[321,2342,657],{},[321,2344,778],{},[321,2346,781],{}," accept the updatable pivot fields with their ",[321,2349,2350],{},"updateRules()",[321,2352,663],{}," refuses ",[321,2355,2356],{},"pivot",[574,2358,2359,2360,2362],{},"The ",[321,2361,2356],{}," of an included row holds the selectable pivot fields.",[574,2364,2365,2366,2369],{},"A filter reaches a pivot field through its relation: ",[321,2367,2368],{},"tags.pivot.weight",", with the operators of its type.",[574,2371,2372,2373,2376,2377,2380,2381,2384,2385,598],{},"A pivot field is a column of the pivot table: a ",[321,2374,2375],{},"virtual()"," pivot field, or one with ",[321,2378,2379],{},"fillUsing()"," or ",[321,2382,2383],{},"resolveUsing()",", throws ",[321,2386,2387],{},"InvalidFieldException",[574,2389,2390,2391,2394,2395,2398,2399,2402],{},"The pivot fields are bound to the pivot class of the relation, the class given to ",[321,2392,2393],{},"using()"," or Laravel's ",[321,2396,2397],{},"Pivot",". An ",[321,2400,2401],{},"Enum"," pivot field reads its enum class from the casts of that class.",[313,2404,2406],{"id":2405},"constraints","Constraints",[318,2408,2409],{},"A relation can be required or refused in a mutation, on creation or on update:",[331,2411,2413],{"className":333,"code":2412,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Relations\\BelongsTo;\n\nBelongsTo::make('category', CategoryResource::class)\n    ->requiredOnCreation()\n    ->prohibitedOnUpdate(),\n",[321,2414,2415,2435,2439,2465,2475],{"__ignoreMap":336},[340,2416,2417,2419,2421,2423,2425,2427,2429,2431,2433],{"class":342,"line":343},[340,2418,347],{"class":346},[340,2420,351],{"class":350},[340,2422,355],{"class":354},[340,2424,358],{"class":350},[340,2426,355],{"class":354},[340,2428,363],{"class":350},[340,2430,355],{"class":354},[340,2432,368],{"class":350},[340,2434,371],{"class":354},[340,2436,2437],{"class":342,"line":374},[340,2438,422],{"emptyLinePlaceholder":421},[340,2440,2441,2443,2445,2447,2449,2451,2453,2455,2457,2459,2461,2463],{"class":342,"line":396},[340,2442,368],{"class":464},[340,2444,468],{"class":354},[340,2446,471],{"class":435},[340,2448,474],{"class":354},[340,2450,477],{"class":354},[340,2452,481],{"class":480},[340,2454,477],{"class":354},[340,2456,486],{"class":354},[340,2458,489],{"class":464},[340,2460,468],{"class":354},[340,2462,494],{"class":346},[340,2464,2117],{"class":354},[340,2466,2467,2470,2473],{"class":342,"line":418},[340,2468,2469],{"class":354},"    ->",[340,2471,2472],{"class":435},"requiredOnCreation",[340,2474,2128],{"class":354},[340,2476,2477,2479,2482],{"class":342,"line":425},[340,2478,2469],{"class":354},[340,2480,2481],{"class":435},"prohibitedOnUpdate",[340,2483,2484],{"class":354},"(),\n",[614,2486,2487,2497],{},[617,2488,2489],{},[620,2490,2491,2494],{},[623,2492,2493],{},"Constraint",[623,2495,2496],{},"Error when it fails",[635,2498,2499,2514],{},[620,2500,2501,2509],{},[640,2502,2503,654,2506],{},[321,2504,2505],{},"requiredOnCreation()",[321,2507,2508],{},"requiredOnUpdate()",[640,2510,2511],{},[321,2512,2513],{},"The mutate.0.relations.category field is required.",[620,2515,2516,2524],{},[640,2517,2518,654,2521],{},[321,2519,2520],{},"prohibitedOnCreation()",[321,2522,2523],{},"prohibitedOnUpdate()",[640,2525,2526],{},[321,2527,2528],{},"The mutate.0.relations.category field is prohibited.",[318,2530,2531,2532,2534,2535,2537],{},"Each constraint takes a boolean or a callback. The callback receives the request and the related resource, ",[321,2533,1912],{}," on a ",[321,2536,836],{}," with several targets:",[331,2539,2541],{"className":333,"code":2540,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Http\\Requests\\RestRequest;\nuse Lomkit\\Rest\\Http\\Resource;\n\nBelongsTo::make('category', CategoryResource::class)\n    ->requiredOnCreation(fn (RestRequest $request, ?Resource $resource): bool => ! $request->user()?->is_staff),\n",[321,2542,2543,2570,2591,2595,2621],{"__ignoreMap":336},[340,2544,2545,2547,2549,2551,2553,2555,2558,2560,2563,2565,2568],{"class":342,"line":343},[340,2546,347],{"class":346},[340,2548,351],{"class":350},[340,2550,355],{"class":354},[340,2552,358],{"class":350},[340,2554,355],{"class":354},[340,2556,2557],{"class":350},"Http",[340,2559,355],{"class":354},[340,2561,2562],{"class":350},"Requests",[340,2564,355],{"class":354},[340,2566,2567],{"class":350},"RestRequest",[340,2569,371],{"class":354},[340,2571,2572,2574,2576,2578,2580,2582,2584,2586,2589],{"class":342,"line":374},[340,2573,347],{"class":346},[340,2575,351],{"class":350},[340,2577,355],{"class":354},[340,2579,358],{"class":350},[340,2581,355],{"class":354},[340,2583,2557],{"class":350},[340,2585,355],{"class":354},[340,2587,2588],{"class":350},"Resource",[340,2590,371],{"class":354},[340,2592,2593],{"class":342,"line":396},[340,2594,422],{"emptyLinePlaceholder":421},[340,2596,2597,2599,2601,2603,2605,2607,2609,2611,2613,2615,2617,2619],{"class":342,"line":418},[340,2598,368],{"class":464},[340,2600,468],{"class":354},[340,2602,471],{"class":435},[340,2604,474],{"class":354},[340,2606,477],{"class":354},[340,2608,481],{"class":480},[340,2610,477],{"class":354},[340,2612,486],{"class":354},[340,2614,489],{"class":464},[340,2616,468],{"class":354},[340,2618,494],{"class":346},[340,2620,2117],{"class":354},[340,2622,2623,2625,2627,2629,2632,2635,2637,2640,2643,2645,2648,2650,2652,2654,2657,2660,2663,2666,2668,2670,2673,2676,2679,2682],{"class":342,"line":425},[340,2624,2469],{"class":354},[340,2626,2472],{"class":435},[340,2628,474],{"class":354},[340,2630,2631],{"class":428},"fn",[340,2633,2634],{"class":354}," (",[340,2636,2567],{"class":464},[340,2638,2639],{"class":354}," $",[340,2641,2642],{"class":350},"request",[340,2644,486],{"class":354},[340,2646,2647],{"class":354}," ?",[340,2649,2588],{"class":464},[340,2651,2639],{"class":354},[340,2653,328],{"class":350},[340,2655,2656],{"class":354},"):",[340,2658,2659],{"class":346}," bool",[340,2661,2662],{"class":354}," =>",[340,2664,2665],{"class":354}," !",[340,2667,2639],{"class":354},[340,2669,2642],{"class":350},[340,2671,2672],{"class":354},"->",[340,2674,2675],{"class":435},"user",[340,2677,2678],{"class":354},"()?->",[340,2680,2681],{"class":350},"is_staff",[340,2683,497],{"class":354},[318,2685,2686,2687,2689],{},"A relation that is required on update is required in every ",[321,2688,657],{}," entry, and an empty list does not satisfy it.",[318,2691,2692,2693,890,2695,598],{},"The details list the constraints of each relation under ",[321,2694,2405],{},[321,2696,2697],{},"?with=relations.constraints",[313,2699,2701],{"id":2700},"link-abilities","Link abilities",[318,2703,2704,2705,2707],{},"A mutation that links two rows checks the link on the policy of the parent row. By default, it checks ",[321,2706,657],{}," on the parent. Declare the abilities of the relation to check others:",[331,2709,2711],{"className":333,"code":2710,"language":335,"meta":336,"style":336},"BelongsToMany::make('tags', TagResource::class)\n    ->abilities(attach: 'attachTag', detach: 'detachTag'),\n",[321,2712,2713,2739],{"__ignoreMap":336},[340,2714,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737],{"class":342,"line":343},[340,2716,391],{"class":464},[340,2718,468],{"class":354},[340,2720,471],{"class":435},[340,2722,474],{"class":354},[340,2724,477],{"class":354},[340,2726,544],{"class":480},[340,2728,477],{"class":354},[340,2730,486],{"class":354},[340,2732,551],{"class":464},[340,2734,468],{"class":354},[340,2736,494],{"class":346},[340,2738,2117],{"class":354},[340,2740,2741,2743,2746,2748,2750,2752,2754,2757,2759,2761,2764,2766,2768,2771,2773],{"class":342,"line":374},[340,2742,2469],{"class":354},[340,2744,2745],{"class":435},"abilities",[340,2747,474],{"class":354},[340,2749,660],{"class":464},[340,2751,913],{"class":354},[340,2753,2300],{"class":354},[340,2755,2756],{"class":480},"attachTag",[340,2758,477],{"class":354},[340,2760,486],{"class":354},[340,2762,2763],{"class":464}," detach",[340,2765,913],{"class":354},[340,2767,2300],{"class":354},[340,2769,2770],{"class":480},"detachTag",[340,2772,477],{"class":354},[340,2774,497],{"class":354},[331,2776,2779],{"className":333,"code":2777,"filename":2778,"language":335,"meta":336,"style":336},"public function attachTag(User $user, Post $post, Tag $tag): bool\n{\n    return $user->team_id === $post->team_id;\n}\n","app\u002FPolicies\u002FPostPolicy.php",[321,2780,2781,2823,2827,2854],{"__ignoreMap":336},[340,2782,2783,2785,2787,2790,2792,2794,2796,2798,2800,2803,2805,2808,2810,2813,2815,2818,2820],{"class":342,"line":343},[340,2784,429],{"class":428},[340,2786,432],{"class":428},[340,2788,2789],{"class":435}," attachTag",[340,2791,474],{"class":354},[340,2793,993],{"class":464},[340,2795,2639],{"class":354},[340,2797,2675],{"class":350},[340,2799,486],{"class":354},[340,2801,2802],{"class":464}," Post",[340,2804,2639],{"class":354},[340,2806,2807],{"class":350},"post",[340,2809,486],{"class":354},[340,2811,2812],{"class":464}," Tag",[340,2814,2639],{"class":354},[340,2816,2817],{"class":350},"tag",[340,2819,2656],{"class":354},[340,2821,2822],{"class":346}," bool\n",[340,2824,2825],{"class":342,"line":374},[340,2826,448],{"class":354},[340,2828,2829,2831,2833,2835,2837,2840,2843,2845,2847,2849,2852],{"class":342,"line":396},[340,2830,455],{"class":454},[340,2832,2639],{"class":354},[340,2834,2675],{"class":350},[340,2836,2672],{"class":354},[340,2838,2839],{"class":350},"team_id ",[340,2841,2842],{"class":354},"===",[340,2844,2639],{"class":354},[340,2846,2807],{"class":350},[340,2848,2672],{"class":354},[340,2850,2851],{"class":350},"team_id",[340,2853,371],{"class":354},[340,2855,2856],{"class":342,"line":418},[340,2857,569],{"class":354},[318,2859,2860,2862,2863,654,2865,1284,2867,2869,2870,1284,2872,2874,2875,2862,2877,2869,2879,1284,2881,2883,2884,598],{},[321,2861,660],{}," covers the ",[321,2864,653],{},[321,2866,657],{},[321,2868,660],{}," entries and the rows that ",[321,2871,778],{},[321,2873,781],{}," attach. ",[321,2876,663],{},[321,2878,663],{},[321,2880,778],{},[321,2882,781],{}," detach. A declared ability that no policy method answers is denied. See ",[607,2885,154],{"href":155},[313,2887,2889],{"id":2888},"deleting-child-rows","Deleting child rows",[318,2891,2892,2893,2895,2896,654,2898,654,2900,654,2902,654,2904,1284,2906,913],{},"A child relation can delete its rows in the same mutation as their parent once it declares ",[321,2894,693],{},". This applies to ",[321,2897,670],{},[321,2899,700],{},[321,2901,413],{},[321,2903,788],{},[321,2905,804],{},[321,2907,820],{},[331,2909,2911],{"className":333,"code":2910,"language":335,"meta":336,"style":336},"HasMany::make('lines', OrderLineResource::class)->deletable(),\n",[321,2912,2913],{"__ignoreMap":336},[340,2914,2915,2917,2919,2921,2923,2925,2928,2930,2932,2935,2937,2939,2941,2944],{"class":342,"line":343},[340,2916,413],{"class":464},[340,2918,468],{"class":354},[340,2920,471],{"class":435},[340,2922,474],{"class":354},[340,2924,477],{"class":354},[340,2926,2927],{"class":480},"lines",[340,2929,477],{"class":354},[340,2931,486],{"class":354},[340,2933,2934],{"class":464}," OrderLineResource",[340,2936,468],{"class":354},[340,2938,494],{"class":346},[340,2940,2090],{"class":354},[340,2942,2943],{"class":435},"deletable",[340,2945,2484],{"class":354},[331,2947,2949],{"className":1802,"code":2948,"language":1804,"meta":336,"style":336},"{\n  \"mutate\": [\n    {\n      \"operation\": \"update\",\n      \"key\": 7,\n      \"relations\": {\n        \"lines\": [{\"operation\": \"delete\", \"key\": [102, 103]}]\n      }\n    }\n  ]\n}\n",[321,2950,2951,2955,2968,2973,2994,3010,3023,3075,3080,3085,3090],{"__ignoreMap":336},[340,2952,2953],{"class":342,"line":343},[340,2954,448],{"class":354},[340,2956,2957,2960,2962,2964,2966],{"class":342,"line":374},[340,2958,2959],{"class":354},"  \"",[340,2961,597],{"class":428},[340,2963,1814],{"class":354},[340,2965,913],{"class":354},[340,2967,458],{"class":354},[340,2969,2970],{"class":342,"line":396},[340,2971,2972],{"class":354},"    {\n",[340,2974,2975,2978,2981,2983,2985,2987,2989,2991],{"class":342,"line":418},[340,2976,2977],{"class":354},"      \"",[340,2979,2980],{"class":464},"operation",[340,2982,1814],{"class":354},[340,2984,913],{"class":354},[340,2986,1829],{"class":354},[340,2988,657],{"class":480},[340,2990,1814],{"class":354},[340,2992,2993],{"class":354},",\n",[340,2995,2996,2998,3001,3003,3005,3008],{"class":342,"line":425},[340,2997,2977],{"class":354},[340,2999,3000],{"class":464},"key",[340,3002,1814],{"class":354},[340,3004,913],{"class":354},[340,3006,3007],{"class":346}," 7",[340,3009,2993],{"class":354},[340,3011,3012,3014,3016,3018,3020],{"class":342,"line":445},[340,3013,2977],{"class":354},[340,3015,593],{"class":464},[340,3017,1814],{"class":354},[340,3019,913],{"class":354},[340,3021,3022],{"class":354}," {\n",[340,3024,3025,3028,3030,3032,3034,3037,3039,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3067,3069,3072],{"class":342,"line":451},[340,3026,3027],{"class":354},"        \"",[340,3029,2927],{"class":346},[340,3031,1814],{"class":354},[340,3033,913],{"class":354},[340,3035,3036],{"class":354}," [{",[340,3038,1814],{"class":354},[340,3040,2980],{"class":3041},"swJcz",[340,3043,1814],{"class":354},[340,3045,913],{"class":354},[340,3047,1829],{"class":354},[340,3049,689],{"class":480},[340,3051,1814],{"class":354},[340,3053,486],{"class":354},[340,3055,1829],{"class":354},[340,3057,3000],{"class":3041},[340,3059,1814],{"class":354},[340,3061,913],{"class":354},[340,3063,1702],{"class":354},[340,3065,3066],{"class":346},"102",[340,3068,486],{"class":354},[340,3070,3071],{"class":346}," 103",[340,3073,3074],{"class":354},"]}]\n",[340,3076,3077],{"class":342,"line":461},[340,3078,3079],{"class":354},"      }\n",[340,3081,3082],{"class":342,"line":500},[340,3083,3084],{"class":354},"    }\n",[340,3086,3087],{"class":342,"line":530},[340,3088,3089],{"class":354},"  ]\n",[340,3091,3092],{"class":342,"line":560},[340,3093,569],{"class":354},[318,3095,3096,3097,3099,3100,3102,3103,3106,3107,3110,3111,3113,3114,3116,3117,3119,3120,598],{},"Each key must be a child of the parent row. Each row is checked with the ",[321,3098,689],{}," policy of the related resource and with the ",[321,3101,663],{}," link check, then deleted through the ",[321,3104,3105],{},"performDelete()"," of the related resource. The hooks of the ",[321,3108,3109],{},"destroy"," endpoint do not run. The details list ",[321,3112,689],{}," last in the ",[321,3115,889],{}," of a ",[321,3118,693],{}," relation. See ",[607,3121,110],{"href":3122},"\u002Fwriting\u002Frelations#deleting-child-rows",[313,3124,3126],{"id":3125},"custom-relations","Custom relations",[318,3128,3129,3130,3133,3134,3137,3138,3141,3142,913],{},"A relation class of your application extends one of the package classes. ",[321,3131,3132],{},"mutationOperations()"," lists the operations that its entries accept, as cases of ",[321,3135,3136],{},"Lomkit\\Rest\\Fields\\MutationOperation",". A relation that returns ",[321,3139,3140],{},"[]"," takes no entry in ",[321,3143,597],{},[331,3145,3147],{"className":333,"code":3146,"language":335,"meta":336,"style":336},"use Lomkit\\Rest\\Fields\\MutationOperation;\nuse Lomkit\\Rest\\Relations\\HasMany;\n\nclass AppendOnlyHasMany extends HasMany\n{\n    public function mutationOperations(): array\n    {\n        return [MutationOperation::Create];\n    }\n}\n",[321,3148,3149,3170,3190,3194,3207,3211,3225,3229,3246,3250],{"__ignoreMap":336},[340,3150,3151,3153,3155,3157,3159,3161,3163,3165,3168],{"class":342,"line":343},[340,3152,347],{"class":346},[340,3154,351],{"class":350},[340,3156,355],{"class":354},[340,3158,358],{"class":350},[340,3160,355],{"class":354},[340,3162,42],{"class":350},[340,3164,355],{"class":354},[340,3166,3167],{"class":350},"MutationOperation",[340,3169,371],{"class":354},[340,3171,3172,3174,3176,3178,3180,3182,3184,3186,3188],{"class":342,"line":374},[340,3173,347],{"class":346},[340,3175,351],{"class":350},[340,3177,355],{"class":354},[340,3179,358],{"class":350},[340,3181,355],{"class":354},[340,3183,363],{"class":350},[340,3185,355],{"class":354},[340,3187,413],{"class":350},[340,3189,371],{"class":354},[340,3191,3192],{"class":342,"line":396},[340,3193,422],{"emptyLinePlaceholder":421},[340,3195,3196,3198,3201,3204],{"class":342,"line":418},[340,3197,494],{"class":428},[340,3199,3200],{"class":464}," AppendOnlyHasMany",[340,3202,3203],{"class":428}," extends",[340,3205,3206],{"class":464}," HasMany\n",[340,3208,3209],{"class":342,"line":425},[340,3210,448],{"class":354},[340,3212,3213,3216,3218,3221,3223],{"class":342,"line":445},[340,3214,3215],{"class":428},"    public",[340,3217,432],{"class":428},[340,3219,3220],{"class":435}," mutationOperations",[340,3222,439],{"class":354},[340,3224,442],{"class":346},[340,3226,3227],{"class":342,"line":451},[340,3228,2972],{"class":354},[340,3230,3231,3234,3236,3238,3240,3243],{"class":342,"line":461},[340,3232,3233],{"class":454},"        return",[340,3235,1702],{"class":354},[340,3237,3167],{"class":464},[340,3239,468],{"class":354},[340,3241,3242],{"class":350},"Create",[340,3244,3245],{"class":354},"];\n",[340,3247,3248],{"class":342,"line":500},[340,3249,3084],{"class":354},[340,3251,3252],{"class":342,"line":530},[340,3253,569],{"class":354},[318,3255,3256,3257,1284,3260,3263,3264,3267,3268,3271],{},"The package writes a relation by the class of its Eloquent relation. A relation has no write hook: change a write in the ",[321,3258,3259],{},"mutating()",[321,3261,3262],{},"mutated()"," hooks of the resource. A custom relation with pivot fields implements ",[321,3265,3266],{},"Lomkit\\Rest\\Contracts\\PivotRelation",", which the ",[321,3269,3270],{},"Lomkit\\Rest\\Concerns\\Relations\\HasPivotFields"," trait implements.",[3273,3274,3275],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":336,"searchDepth":343,"depth":374,"links":3277},[3278,3279,3287,3288,3289,3290,3291],{"id":315,"depth":374,"text":316},{"id":611,"depth":374,"text":612,"children":3280},[3281,3282,3283,3284,3285,3286],{"id":901,"depth":396,"text":902},{"id":987,"depth":396,"text":988},{"id":1170,"depth":396,"text":1171},{"id":1297,"depth":396,"text":1298},{"id":1481,"depth":396,"text":1482},{"id":1642,"depth":396,"text":1643},{"id":1961,"depth":374,"text":1962},{"id":2405,"depth":374,"text":2406},{"id":2700,"depth":374,"text":2701},{"id":2888,"depth":374,"text":2889},{"id":3125,"depth":374,"text":3126},"Declare the Eloquent relations of a resource, their targets, pivot fields, constraints, link abilities and the operations a mutation accepts on them.","md",null,{},{"title":46,"description":3292},{"loc":47},"phA1h7dOfN1xzP-L2XuEpG3D4khorR6l9ksi83i6O34",[3300,3302],{"title":42,"path":43,"stem":44,"description":3301,"children":-1},"Typed fields decide what clients select, sort, filter and write, how each value is validated, and how it is documented.",{"title":50,"path":51,"stem":52,"description":3303,"children":-1},"Field rules, resource rules, rules that depend on the entry, labels and messages, unknown keys, and how the package validates each payload in one pass.",1794181350041]