[{"data":1,"prerenderedAt":2156},["ShallowReactive",2],{"navigation":3,"\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffilterable-classes":273,"\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffilterable-classes-surround":2102,"packages-data":2107},[4,23],{"title":5,"path":6,"stem":7,"children":8,"icon":22},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,12,17],{"title":10,"path":6,"stem":7,"icon":11},"Introduction","i-tabler-home",{"title":13,"path":14,"stem":15,"icon":16},"Manifest","\u002Fgetting-started\u002Fmanifest","1.getting-started\u002F2.manifest","i-tabler-file-diff",{"title":18,"path":19,"stem":20,"icon":21},"Contributing","\u002Fgetting-started\u002Fcontributing","1.getting-started\u002F3.contributing","i-tabler-git-fork",false,{"title":24,"path":25,"stem":26,"children":27,"icon":30},"Packages","\u002Fpackages","2.packages\u002F1.index",[28,31,108,194,247],{"title":29,"path":25,"stem":26,"icon":30},"Overview","i-tabler-packages",{"title":32,"icon":33,"path":34,"stem":35,"children":36,"page":22},"AdonisJS API Query","i-tabler-filter-search","\u002Fpackages\u002Fadonisjs-api-query","2.packages\u002Fadonisjs-api-query",[37,56,87],{"title":5,"icon":38,"path":39,"stem":40,"children":41,"page":22},"i-tabler-rocket","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started","2.packages\u002Fadonisjs-api-query\u002F1.getting-started",[42,46,51],{"title":10,"path":43,"stem":44,"icon":45},"\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F1.introduction","i-tabler-book",{"title":47,"path":48,"stem":49,"icon":50},"Installation","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F2.installation","i-tabler-download",{"title":52,"path":53,"stem":54,"icon":55},"Configuration","\u002Fpackages\u002Fadonisjs-api-query\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-api-query\u002F1.getting-started\u002F3.configuration","i-tabler-settings",{"title":57,"icon":58,"path":59,"stem":60,"children":61,"page":22},"Features","i-tabler-sparkles","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures","2.packages\u002Fadonisjs-api-query\u002F2.features",[62,67,72,77,82],{"title":63,"path":64,"stem":65,"icon":66},"Filtering","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffiltering","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F1.filtering","i-tabler-filter",{"title":68,"path":69,"stem":70,"icon":71},"Sorting","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fsorting","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F2.sorting","i-tabler-arrows-sort",{"title":73,"path":74,"stem":75,"icon":76},"Including Relationships","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fincluding-relationships","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F3.including-relationships","i-tabler-hierarchy-2",{"title":78,"path":79,"stem":80,"icon":81},"Filterable Classes","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Ffilterable-classes","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F4.filterable-classes","i-tabler-box-model",{"title":83,"path":84,"stem":85,"icon":86},"Validation","\u002Fpackages\u002Fadonisjs-api-query\u002Ffeatures\u002Fvalidation","2.packages\u002Fadonisjs-api-query\u002F2.features\u002F5.validation","i-tabler-shield-check",{"title":88,"icon":89,"path":90,"stem":91,"children":92,"page":22},"Advanced Usage","i-tabler-adjustments","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced","2.packages\u002Fadonisjs-api-query\u002F3.advanced",[93,98,103],{"title":94,"path":95,"stem":96,"icon":97},"Custom Filters, Sorts & Includes","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Fcustom-clauses","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F1.custom-clauses","i-tabler-puzzle",{"title":99,"path":100,"stem":101,"icon":102},"Request & Delimiters","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Frequest-and-delimiters","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F2.request-and-delimiters","i-tabler-brackets-contain",{"title":104,"path":105,"stem":106,"icon":107},"Exceptions","\u002Fpackages\u002Fadonisjs-api-query\u002Fadvanced\u002Fexceptions","2.packages\u002Fadonisjs-api-query\u002F3.advanced\u002F3.exceptions","i-tabler-alert-triangle",{"title":109,"icon":110,"path":111,"stem":112,"children":113,"page":22},"AdonisJS Permission","i-tabler-shield-lock","\u002Fpackages\u002Fadonisjs-permission","2.packages\u002Fadonisjs-permission",[114,127,157,183],{"title":5,"icon":38,"path":115,"stem":116,"children":117,"page":22},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started","2.packages\u002Fadonisjs-permission\u002F1.getting-started",[118,121,124],{"title":10,"path":119,"stem":120,"icon":45},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F1.introduction",{"title":47,"path":122,"stem":123,"icon":50},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F2.installation",{"title":52,"path":125,"stem":126,"icon":55},"\u002Fpackages\u002Fadonisjs-permission\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-permission\u002F1.getting-started\u002F3.configuration",{"title":128,"icon":86,"path":129,"stem":130,"children":131,"page":22},"Basic Usage","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage","2.packages\u002Fadonisjs-permission\u002F2.basic-usage",[132,137,142,147,152],{"title":133,"path":134,"stem":135,"icon":136},"Roles & Permissions","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Froles-and-permissions","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F1.roles-and-permissions","i-tabler-users",{"title":138,"path":139,"stem":140,"icon":141},"Checking Access","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fchecking","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F2.checking","i-tabler-checks",{"title":143,"path":144,"stem":145,"icon":146},"Middleware","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fmiddleware","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F3.middleware","i-tabler-route",{"title":148,"path":149,"stem":150,"icon":151},"Wildcard Permissions","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fwildcard-permissions","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F4.wildcard-permissions","i-tabler-asterisk",{"title":153,"path":154,"stem":155,"icon":156},"Catalog & Sync","\u002Fpackages\u002Fadonisjs-permission\u002Fbasic-usage\u002Fcatalog","2.packages\u002Fadonisjs-permission\u002F2.basic-usage\u002F5.catalog","i-tabler-refresh",{"title":158,"icon":159,"path":160,"stem":161,"children":162,"page":22},"Advanced","i-tabler-tool","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced","2.packages\u002Fadonisjs-permission\u002F3.advanced",[163,168,173,178],{"title":164,"path":165,"stem":166,"icon":167},"Teams","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fteams","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F1.teams","i-tabler-building",{"title":169,"path":170,"stem":171,"icon":172},"Super-Admin","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fsuper-admin","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F2.super-admin","i-tabler-crown",{"title":174,"path":175,"stem":176,"icon":177},"Events","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fevents","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F3.events","i-tabler-radio",{"title":179,"path":180,"stem":181,"icon":182},"Cache","\u002Fpackages\u002Fadonisjs-permission\u002Fadvanced\u002Fcache","2.packages\u002Fadonisjs-permission\u002F3.advanced\u002F4.cache","i-tabler-database",{"title":184,"icon":185,"path":186,"stem":187,"children":188,"page":22},"Upgrading","i-tabler-circle-arrow-up","\u002Fpackages\u002Fadonisjs-permission\u002Fupgrading","2.packages\u002Fadonisjs-permission\u002F4.upgrading",[189],{"title":190,"path":191,"stem":192,"icon":193},"From adonis-lucid-permission","\u002Fpackages\u002Fadonisjs-permission\u002Fupgrading\u002Ffrom-adonis-lucid-permission","2.packages\u002Fadonisjs-permission\u002F4.upgrading\u002F1.from-adonis-lucid-permission","i-tabler-git-compare",{"title":195,"icon":196,"path":197,"stem":198,"children":199,"page":22},"Simple Auth","i-tabler-key","\u002Fpackages\u002Fadonisjs-simple-auth","2.packages\u002Fadonisjs-simple-auth",[200,214,233],{"title":5,"icon":38,"path":201,"stem":202,"children":203,"page":22},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started",[204,208,211],{"title":10,"path":205,"stem":206,"icon":207},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F1.introduction","i-tabler-info-circle",{"title":47,"path":209,"stem":210,"icon":50},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F2.installation",{"title":52,"path":212,"stem":213,"icon":55},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fgetting-started\u002Fconfiguration","2.packages\u002Fadonisjs-simple-auth\u002F1.getting-started\u002F3.configuration",{"title":215,"icon":110,"path":216,"stem":217,"children":218,"page":22},"Usage","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage","2.packages\u002Fadonisjs-simple-auth\u002F2.usage",[219,224,229],{"title":220,"path":221,"stem":222,"icon":223},"Generating API Keys","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Fgenerating-api-keys","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F1.generating-api-keys","i-tabler-terminal-2",{"title":225,"path":226,"stem":227,"icon":228},"Protecting Routes","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Fprotecting-routes","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F2.protecting-routes","i-tabler-lock",{"title":230,"path":231,"stem":232,"icon":107},"Error Handling & i18n","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fusage\u002Ferror-handling","2.packages\u002Fadonisjs-simple-auth\u002F2.usage\u002F3.error-handling",{"title":158,"icon":89,"path":234,"stem":235,"children":236,"page":22},"\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced",[237,242],{"title":238,"path":239,"stem":240,"icon":241},"Testing with Japa","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced\u002Ftesting-with-japa","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced\u002F1.testing-with-japa","i-tabler-flask",{"title":243,"path":244,"stem":245,"icon":246},"API Reference","\u002Fpackages\u002Fadonisjs-simple-auth\u002Fadvanced\u002Fapi-reference","2.packages\u002Fadonisjs-simple-auth\u002F3.advanced\u002F2.api-reference","i-tabler-code",{"title":248,"icon":249,"path":250,"stem":251,"children":252,"page":22},"AdonisJS Soft Deletes","i-tabler-trash-off","\u002Fpackages\u002Fadonisjs-soft-deletes","2.packages\u002Fadonisjs-soft-deletes",[253,263],{"title":5,"icon":38,"path":254,"stem":255,"children":256,"page":22},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started",[257,260],{"title":10,"path":258,"stem":259,"icon":207},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started\u002Fintroduction","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started\u002F1.introduction",{"title":47,"path":261,"stem":262,"icon":50},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fgetting-started\u002Finstallation","2.packages\u002Fadonisjs-soft-deletes\u002F1.getting-started\u002F2.installation",{"title":215,"icon":45,"path":264,"stem":265,"children":266,"page":22},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage",[267,270],{"title":215,"path":268,"stem":269,"icon":246},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage\u002Fusage","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage\u002F1.usage",{"title":243,"path":271,"stem":272,"icon":45},"\u002Fpackages\u002Fadonisjs-soft-deletes\u002Fusage\u002Fapi-reference","2.packages\u002Fadonisjs-soft-deletes\u002F2.usage\u002F2.api-reference",{"id":274,"title":78,"body":275,"description":2096,"extension":2097,"meta":2098,"navigation":2099,"path":79,"seo":2100,"stem":80,"__hash__":2101},"docs\u002F2.packages\u002Fadonisjs-api-query\u002F2.features\u002F4.filterable-classes.md",{"type":276,"value":277,"toc":2083},"minimark",[278,304,309,316,1015,1048,1052,1065,1157,1183,1187,1190,1512,1516,1519,1527,1760,1767,1934,1941,1952,2079],[279,280,281,282,286,287,290,291,294,295,299,300,303],"p",{},"Instead of repeating ",[283,284,285],"code",{},".allowedFilters()",", ",[283,288,289],{},".allowedSorts()",", and ",[283,292,293],{},".allowedIncludes()"," across your controllers, you can encapsulate all query building logic in a dedicated ",[296,297,298],"strong",{},"Filterable Class"," extending ",[283,301,302],{},"BaseFilterable",".",[305,306,308],"h2",{"id":307},"creating-a-filterable-class","Creating a Filterable Class",[279,310,311,312,315],{},"Use ",[283,313,314],{},"BaseFilterable.for(() => Model)"," to create a strongly-typed filterable class for a specific Lucid model:",[317,318,324],"pre",{"className":319,"code":320,"filename":321,"language":322,"meta":323,"style":323},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type { HttpRequest } from '@adonisjs\u002Fcore\u002Fhttp';\nimport type { ModelQueryBuilderContract } from '@adonisjs\u002Flucid\u002Ftypes\u002Fmodel';\nimport { AllowedFilter, BaseFilterable } from '@eienjs\u002Fadonisjs-api-query';\nimport User from '#models\u002Fuser';\n\nexport default class UserFilterable extends BaseFilterable.for(() => User) {\n  \u002F\u002F Allowed filters: column names, AllowedFilter instances, or custom method names\n  public filters = [\n    'name',\n    'status',\n    AllowedFilter.exact('email'),\n    AllowedFilter.scope('verified'),\n  ];\n\n  \u002F\u002F Allowed sorts\n  public sorts = ['name', 'createdAt', 'postsCount'];\n\n  \u002F\u002F Fallback sort when ?sort= is not present in the URL\n  public defaultSorts = '-createdAt';\n\n  \u002F\u002F Allowed relationship includes\n  public includes = ['posts', 'profile'];\n\n  \u002F\u002F Optional lifecycle hook executed before filters, sorts, and includes\n  public setup(query: ModelQueryBuilderContract\u003Ctypeof User>, _request?: HttpRequest) {\n    void query.where('isActive', true);\n  }\n\n  \u002F\u002F Auto-bound custom filter method for 'status'\n  public filterStatus(query: ModelQueryBuilderContract\u003Ctypeof User>, value: unknown) {\n    void query.where('status', String(value));\n  }\n\n  \u002F\u002F Auto-bound custom sort method for 'postsCount'\n  public sortPostsCount(query: ModelQueryBuilderContract\u003Ctypeof User>, isDescending: boolean) {\n    void query.withCount('posts').orderBy('posts_count', isDescending ? 'desc' : 'asc');\n  }\n}\n","app\u002Ffilters\u002Fuser_filterable.ts","ts","",[283,325,326,365,390,419,439,446,489,496,512,526,538,563,586,594,599,605,647,652,658,677,682,688,720,725,731,772,805,811,816,822,856,890,895,900,906,940,1004,1009],{"__ignoreMap":323},[327,328,331,335,338,342,346,349,352,355,359,362],"span",{"class":329,"line":330},"line",1,[327,332,334],{"class":333},"s7zQu","import",[327,336,337],{"class":333}," type",[327,339,341],{"class":340},"sMK4o"," {",[327,343,345],{"class":344},"sTEyZ"," HttpRequest",[327,347,348],{"class":340}," }",[327,350,351],{"class":333}," from",[327,353,354],{"class":340}," '",[327,356,358],{"class":357},"sfazB","@adonisjs\u002Fcore\u002Fhttp",[327,360,361],{"class":340},"'",[327,363,364],{"class":340},";\n",[327,366,368,370,372,374,377,379,381,383,386,388],{"class":329,"line":367},2,[327,369,334],{"class":333},[327,371,337],{"class":333},[327,373,341],{"class":340},[327,375,376],{"class":344}," ModelQueryBuilderContract",[327,378,348],{"class":340},[327,380,351],{"class":333},[327,382,354],{"class":340},[327,384,385],{"class":357},"@adonisjs\u002Flucid\u002Ftypes\u002Fmodel",[327,387,361],{"class":340},[327,389,364],{"class":340},[327,391,393,395,397,400,403,406,408,410,412,415,417],{"class":329,"line":392},3,[327,394,334],{"class":333},[327,396,341],{"class":340},[327,398,399],{"class":344}," AllowedFilter",[327,401,402],{"class":340},",",[327,404,405],{"class":344}," BaseFilterable",[327,407,348],{"class":340},[327,409,351],{"class":333},[327,411,354],{"class":340},[327,413,414],{"class":357},"@eienjs\u002Fadonisjs-api-query",[327,416,361],{"class":340},[327,418,364],{"class":340},[327,420,422,424,427,430,432,435,437],{"class":329,"line":421},4,[327,423,334],{"class":333},[327,425,426],{"class":344}," User ",[327,428,429],{"class":333},"from",[327,431,354],{"class":340},[327,433,434],{"class":357},"#models\u002Fuser",[327,436,361],{"class":340},[327,438,364],{"class":340},[327,440,442],{"class":329,"line":441},5,[327,443,445],{"emptyLinePlaceholder":444},true,"\n",[327,447,449,452,455,459,463,466,468,470,474,477,480,483,486],{"class":329,"line":448},6,[327,450,451],{"class":333},"export",[327,453,454],{"class":333}," default",[327,456,458],{"class":457},"spNyl"," class",[327,460,462],{"class":461},"sBMFI"," UserFilterable",[327,464,465],{"class":457}," extends",[327,467,405],{"class":344},[327,469,303],{"class":340},[327,471,473],{"class":472},"s2Zo4","for",[327,475,476],{"class":344},"(",[327,478,479],{"class":340},"()",[327,481,482],{"class":457}," =>",[327,484,485],{"class":344}," User) ",[327,487,488],{"class":340},"{\n",[327,490,492],{"class":329,"line":491},7,[327,493,495],{"class":494},"sHwdD","  \u002F\u002F Allowed filters: column names, AllowedFilter instances, or custom method names\n",[327,497,499,502,506,509],{"class":329,"line":498},8,[327,500,501],{"class":457},"  public",[327,503,505],{"class":504},"swJcz"," filters",[327,507,508],{"class":340}," =",[327,510,511],{"class":344}," [\n",[327,513,515,518,521,523],{"class":329,"line":514},9,[327,516,517],{"class":340},"    '",[327,519,520],{"class":357},"name",[327,522,361],{"class":340},[327,524,525],{"class":340},",\n",[327,527,529,531,534,536],{"class":329,"line":528},10,[327,530,517],{"class":340},[327,532,533],{"class":357},"status",[327,535,361],{"class":340},[327,537,525],{"class":340},[327,539,541,544,546,549,551,553,556,558,561],{"class":329,"line":540},11,[327,542,543],{"class":344},"    AllowedFilter",[327,545,303],{"class":340},[327,547,548],{"class":504},"exact",[327,550,476],{"class":344},[327,552,361],{"class":340},[327,554,555],{"class":357},"email",[327,557,361],{"class":340},[327,559,560],{"class":344},")",[327,562,525],{"class":340},[327,564,566,568,570,573,575,577,580,582,584],{"class":329,"line":565},12,[327,567,543],{"class":344},[327,569,303],{"class":340},[327,571,572],{"class":504},"scope",[327,574,476],{"class":344},[327,576,361],{"class":340},[327,578,579],{"class":357},"verified",[327,581,361],{"class":340},[327,583,560],{"class":344},[327,585,525],{"class":340},[327,587,589,592],{"class":329,"line":588},13,[327,590,591],{"class":344},"  ]",[327,593,364],{"class":340},[327,595,597],{"class":329,"line":596},14,[327,598,445],{"emptyLinePlaceholder":444},[327,600,602],{"class":329,"line":601},15,[327,603,604],{"class":494},"  \u002F\u002F Allowed sorts\n",[327,606,608,610,613,615,618,620,622,624,626,628,631,633,635,637,640,642,645],{"class":329,"line":607},16,[327,609,501],{"class":457},[327,611,612],{"class":504}," sorts",[327,614,508],{"class":340},[327,616,617],{"class":344}," [",[327,619,361],{"class":340},[327,621,520],{"class":357},[327,623,361],{"class":340},[327,625,402],{"class":340},[327,627,354],{"class":340},[327,629,630],{"class":357},"createdAt",[327,632,361],{"class":340},[327,634,402],{"class":340},[327,636,354],{"class":340},[327,638,639],{"class":357},"postsCount",[327,641,361],{"class":340},[327,643,644],{"class":344},"]",[327,646,364],{"class":340},[327,648,650],{"class":329,"line":649},17,[327,651,445],{"emptyLinePlaceholder":444},[327,653,655],{"class":329,"line":654},18,[327,656,657],{"class":494},"  \u002F\u002F Fallback sort when ?sort= is not present in the URL\n",[327,659,661,663,666,668,670,673,675],{"class":329,"line":660},19,[327,662,501],{"class":457},[327,664,665],{"class":504}," defaultSorts",[327,667,508],{"class":340},[327,669,354],{"class":340},[327,671,672],{"class":357},"-createdAt",[327,674,361],{"class":340},[327,676,364],{"class":340},[327,678,680],{"class":329,"line":679},20,[327,681,445],{"emptyLinePlaceholder":444},[327,683,685],{"class":329,"line":684},21,[327,686,687],{"class":494},"  \u002F\u002F Allowed relationship includes\n",[327,689,691,693,696,698,700,702,705,707,709,711,714,716,718],{"class":329,"line":690},22,[327,692,501],{"class":457},[327,694,695],{"class":504}," includes",[327,697,508],{"class":340},[327,699,617],{"class":344},[327,701,361],{"class":340},[327,703,704],{"class":357},"posts",[327,706,361],{"class":340},[327,708,402],{"class":340},[327,710,354],{"class":340},[327,712,713],{"class":357},"profile",[327,715,361],{"class":340},[327,717,644],{"class":344},[327,719,364],{"class":340},[327,721,723],{"class":329,"line":722},23,[327,724,445],{"emptyLinePlaceholder":444},[327,726,728],{"class":329,"line":727},24,[327,729,730],{"class":494},"  \u002F\u002F Optional lifecycle hook executed before filters, sorts, and includes\n",[327,732,734,736,739,741,745,748,750,753,756,759,762,765,767,769],{"class":329,"line":733},25,[327,735,501],{"class":457},[327,737,738],{"class":504}," setup",[327,740,476],{"class":340},[327,742,744],{"class":743},"sHdIc","query",[327,746,747],{"class":340},":",[327,749,376],{"class":461},[327,751,752],{"class":340},"\u003Ctypeof",[327,754,755],{"class":344}," User",[327,757,758],{"class":340},">,",[327,760,761],{"class":743}," _request",[327,763,764],{"class":340},"?:",[327,766,345],{"class":461},[327,768,560],{"class":340},[327,770,771],{"class":340}," {\n",[327,773,775,778,781,783,786,788,790,793,795,797,801,803],{"class":329,"line":774},26,[327,776,777],{"class":340},"    void",[327,779,780],{"class":344}," query",[327,782,303],{"class":340},[327,784,785],{"class":472},"where",[327,787,476],{"class":504},[327,789,361],{"class":340},[327,791,792],{"class":357},"isActive",[327,794,361],{"class":340},[327,796,402],{"class":340},[327,798,800],{"class":799},"sfNiH"," true",[327,802,560],{"class":504},[327,804,364],{"class":340},[327,806,808],{"class":329,"line":807},27,[327,809,810],{"class":340},"  }\n",[327,812,814],{"class":329,"line":813},28,[327,815,445],{"emptyLinePlaceholder":444},[327,817,819],{"class":329,"line":818},29,[327,820,821],{"class":494},"  \u002F\u002F Auto-bound custom filter method for 'status'\n",[327,823,825,827,830,832,834,836,838,840,842,844,847,849,852,854],{"class":329,"line":824},30,[327,826,501],{"class":457},[327,828,829],{"class":504}," filterStatus",[327,831,476],{"class":340},[327,833,744],{"class":743},[327,835,747],{"class":340},[327,837,376],{"class":461},[327,839,752],{"class":340},[327,841,755],{"class":344},[327,843,758],{"class":340},[327,845,846],{"class":743}," value",[327,848,747],{"class":340},[327,850,851],{"class":461}," unknown",[327,853,560],{"class":340},[327,855,771],{"class":340},[327,857,859,861,863,865,867,869,871,873,875,877,880,882,885,888],{"class":329,"line":858},31,[327,860,777],{"class":340},[327,862,780],{"class":344},[327,864,303],{"class":340},[327,866,785],{"class":472},[327,868,476],{"class":504},[327,870,361],{"class":340},[327,872,533],{"class":357},[327,874,361],{"class":340},[327,876,402],{"class":340},[327,878,879],{"class":472}," String",[327,881,476],{"class":504},[327,883,884],{"class":344},"value",[327,886,887],{"class":504},"))",[327,889,364],{"class":340},[327,891,893],{"class":329,"line":892},32,[327,894,810],{"class":340},[327,896,898],{"class":329,"line":897},33,[327,899,445],{"emptyLinePlaceholder":444},[327,901,903],{"class":329,"line":902},34,[327,904,905],{"class":494},"  \u002F\u002F Auto-bound custom sort method for 'postsCount'\n",[327,907,909,911,914,916,918,920,922,924,926,928,931,933,936,938],{"class":329,"line":908},35,[327,910,501],{"class":457},[327,912,913],{"class":504}," sortPostsCount",[327,915,476],{"class":340},[327,917,744],{"class":743},[327,919,747],{"class":340},[327,921,376],{"class":461},[327,923,752],{"class":340},[327,925,755],{"class":344},[327,927,758],{"class":340},[327,929,930],{"class":743}," isDescending",[327,932,747],{"class":340},[327,934,935],{"class":461}," boolean",[327,937,560],{"class":340},[327,939,771],{"class":340},[327,941,943,945,947,949,952,954,956,958,960,962,964,967,969,971,974,976,978,980,983,985,988,990,993,995,998,1000,1002],{"class":329,"line":942},36,[327,944,777],{"class":340},[327,946,780],{"class":344},[327,948,303],{"class":340},[327,950,951],{"class":472},"withCount",[327,953,476],{"class":504},[327,955,361],{"class":340},[327,957,704],{"class":357},[327,959,361],{"class":340},[327,961,560],{"class":504},[327,963,303],{"class":340},[327,965,966],{"class":472},"orderBy",[327,968,476],{"class":504},[327,970,361],{"class":340},[327,972,973],{"class":357},"posts_count",[327,975,361],{"class":340},[327,977,402],{"class":340},[327,979,930],{"class":344},[327,981,982],{"class":340}," ?",[327,984,354],{"class":340},[327,986,987],{"class":357},"desc",[327,989,361],{"class":340},[327,991,992],{"class":340}," :",[327,994,354],{"class":340},[327,996,997],{"class":357},"asc",[327,999,361],{"class":340},[327,1001,560],{"class":504},[327,1003,364],{"class":340},[327,1005,1007],{"class":329,"line":1006},37,[327,1008,810],{"class":340},[327,1010,1012],{"class":329,"line":1011},38,[327,1013,1014],{"class":340},"}\n",[1016,1017,1018],"tip",{},[279,1019,1020,1021,286,1024,286,1027,286,1030,290,1033,1036,1037,1040,1041,1044,1045,303],{},"Properties like ",[283,1022,1023],{},"filters",[283,1025,1026],{},"sorts",[283,1028,1029],{},"defaultSorts",[283,1031,1032],{},"includes",[283,1034,1035],{},"rules"," can also be defined as ",[296,1038,1039],{},"methods"," (e.g., ",[283,1042,1043],{},"public filters() { return [...]; }",") if you need to compute them dynamically using ",[283,1046,1047],{},"this.request",[305,1049,1051],{"id":1050},"auto-bound-custom-methods","Auto-Bound Custom Methods",[279,1053,1054,1055,286,1057,1059,1060,286,1062,1064],{},"When you include a string identifier in ",[283,1056,1023],{},[283,1058,1026],{},", or ",[283,1061,1032],{},[283,1063,302],{}," automatically checks if your class defines a matching method and binds it as a callback:",[1066,1067,1068,1085],"table",{},[1069,1070,1071],"thead",{},[1072,1073,1074,1079,1082],"tr",{},[1075,1076,1078],"th",{"align":1077},"left","Property Entry",[1075,1080,1081],{"align":1077},"Checked Method Names on Class",[1075,1083,1084],{"align":1077},"Callback Signature",[1086,1087,1088,1117,1137],"tbody",{},[1072,1089,1090,1100,1112],{},[1091,1092,1093,1096,1097],"td",{"align":1077},[283,1094,1095],{},"filters = ['status']"," or ",[283,1098,1099],{},"['user_status']",[1091,1101,1102,1096,1105,1108,1109,560],{"align":1077},[283,1103,1104],{},"filterStatus(query, value)",[283,1106,1107],{},"status(query, value)"," (",[283,1110,1111],{},"filterUserStatus",[1091,1113,1114],{"align":1077},[283,1115,1116],{},"(query, value) => void",[1072,1118,1119,1124,1132],{},[1091,1120,1121],{"align":1077},[283,1122,1123],{},"sorts = ['popularity']",[1091,1125,1126,1096,1129],{"align":1077},[283,1127,1128],{},"sortPopularity(query, isDescending)",[283,1130,1131],{},"popularity(query, isDescending)",[1091,1133,1134],{"align":1077},[283,1135,1136],{},"(query, isDescending) => void",[1072,1138,1139,1144,1152],{},[1091,1140,1141],{"align":1077},[283,1142,1143],{},"includes = ['posts']",[1091,1145,1146,1096,1149],{"align":1077},[283,1147,1148],{},"includePosts(query)",[283,1150,1151],{},"posts(query)",[1091,1153,1154],{"align":1077},[283,1155,1156],{},"(relationSubQuery) => void",[279,1158,1159,1160,286,1163,290,1166,1169,1170,1173,1174,286,1177,290,1180,303],{},"Both ",[283,1161,1162],{},"camelCase",[283,1164,1165],{},"snake_case",[283,1167,1168],{},"kebab-case"," names are converted to ",[283,1171,1172],{},"PascalCase"," when looking up ",[283,1175,1176],{},"filter\u003CPascalName>",[283,1178,1179],{},"sort\u003CPascalName>",[283,1181,1182],{},"include\u003CPascalName>",[305,1184,1186],{"id":1185},"attaching-a-filterable-to-a-lucid-model","Attaching a Filterable to a Lucid Model",[279,1188,1189],{},"You can associate a filterable class with your Lucid model in three ways:",[1191,1192,1193,1289,1390],"code-group",{},[317,1194,1197],{"className":319,"code":1195,"filename":1196,"language":322,"meta":323,"style":323},"import { BaseModel } from '@adonisjs\u002Flucid\u002Form';\nimport UserFilterable from '#filters\u002Fuser_filterable';\n\nexport default class User extends BaseModel {\n  \u002F\u002F Using a lazy thunk `() => UserFilterable` prevents ESM circular dependency issues\n  public static $filterable = () => UserFilterable;\n}\n","Static Property (Recommended)",[283,1198,1199,1221,1239,1243,1259,1264,1285],{"__ignoreMap":323},[327,1200,1201,1203,1205,1208,1210,1212,1214,1217,1219],{"class":329,"line":330},[327,1202,334],{"class":333},[327,1204,341],{"class":340},[327,1206,1207],{"class":344}," BaseModel",[327,1209,348],{"class":340},[327,1211,351],{"class":333},[327,1213,354],{"class":340},[327,1215,1216],{"class":357},"@adonisjs\u002Flucid\u002Form",[327,1218,361],{"class":340},[327,1220,364],{"class":340},[327,1222,1223,1225,1228,1230,1232,1235,1237],{"class":329,"line":367},[327,1224,334],{"class":333},[327,1226,1227],{"class":344}," UserFilterable ",[327,1229,429],{"class":333},[327,1231,354],{"class":340},[327,1233,1234],{"class":357},"#filters\u002Fuser_filterable",[327,1236,361],{"class":340},[327,1238,364],{"class":340},[327,1240,1241],{"class":329,"line":392},[327,1242,445],{"emptyLinePlaceholder":444},[327,1244,1245,1247,1249,1251,1253,1255,1257],{"class":329,"line":421},[327,1246,451],{"class":333},[327,1248,454],{"class":333},[327,1250,458],{"class":457},[327,1252,755],{"class":461},[327,1254,465],{"class":457},[327,1256,1207],{"class":461},[327,1258,771],{"class":340},[327,1260,1261],{"class":329,"line":441},[327,1262,1263],{"class":494},"  \u002F\u002F Using a lazy thunk `() => UserFilterable` prevents ESM circular dependency issues\n",[327,1265,1266,1268,1271,1274,1276,1279,1281,1283],{"class":329,"line":448},[327,1267,501],{"class":457},[327,1269,1270],{"class":457}," static",[327,1272,1273],{"class":504}," $filterable",[327,1275,508],{"class":340},[327,1277,1278],{"class":340}," ()",[327,1280,482],{"class":457},[327,1282,462],{"class":344},[327,1284,364],{"class":340},[327,1286,1287],{"class":329,"line":491},[327,1288,1014],{"class":340},[317,1290,1293],{"className":319,"code":1291,"filename":1292,"language":322,"meta":323,"style":323},"import { BaseModel } from '@adonisjs\u002Flucid\u002Form';\nimport { filterable } from '@eienjs\u002Fadonisjs-api-query';\nimport UserFilterable from '#filters\u002Fuser_filterable';\n\n@filterable(() => UserFilterable)\nexport default class User extends BaseModel {}\n","@filterable Decorator",[283,1294,1295,1315,1336,1352,1356,1373],{"__ignoreMap":323},[327,1296,1297,1299,1301,1303,1305,1307,1309,1311,1313],{"class":329,"line":330},[327,1298,334],{"class":333},[327,1300,341],{"class":340},[327,1302,1207],{"class":344},[327,1304,348],{"class":340},[327,1306,351],{"class":333},[327,1308,354],{"class":340},[327,1310,1216],{"class":357},[327,1312,361],{"class":340},[327,1314,364],{"class":340},[327,1316,1317,1319,1321,1324,1326,1328,1330,1332,1334],{"class":329,"line":367},[327,1318,334],{"class":333},[327,1320,341],{"class":340},[327,1322,1323],{"class":344}," filterable",[327,1325,348],{"class":340},[327,1327,351],{"class":333},[327,1329,354],{"class":340},[327,1331,414],{"class":357},[327,1333,361],{"class":340},[327,1335,364],{"class":340},[327,1337,1338,1340,1342,1344,1346,1348,1350],{"class":329,"line":392},[327,1339,334],{"class":333},[327,1341,1227],{"class":344},[327,1343,429],{"class":333},[327,1345,354],{"class":340},[327,1347,1234],{"class":357},[327,1349,361],{"class":340},[327,1351,364],{"class":340},[327,1353,1354],{"class":329,"line":421},[327,1355,445],{"emptyLinePlaceholder":444},[327,1357,1358,1361,1364,1366,1368,1370],{"class":329,"line":441},[327,1359,1360],{"class":340},"@",[327,1362,1363],{"class":472},"filterable",[327,1365,476],{"class":344},[327,1367,479],{"class":340},[327,1369,482],{"class":457},[327,1371,1372],{"class":344}," UserFilterable)\n",[327,1374,1375,1377,1379,1381,1383,1385,1387],{"class":329,"line":448},[327,1376,451],{"class":333},[327,1378,454],{"class":333},[327,1380,458],{"class":457},[327,1382,755],{"class":461},[327,1384,465],{"class":457},[327,1386,1207],{"class":461},[327,1388,1389],{"class":340}," {}\n",[317,1391,1394],{"className":319,"code":1392,"filename":1393,"language":322,"meta":323,"style":323},"import { compose } from '@adonisjs\u002Fcore\u002Fhelpers';\nimport { BaseModel } from '@adonisjs\u002Flucid\u002Form';\nimport { Filterable } from '@eienjs\u002Fadonisjs-api-query';\nimport UserFilterable from '#filters\u002Fuser_filterable';\n\nexport default class User extends compose(BaseModel, Filterable(() => UserFilterable)) {}\n","Filterable Mixin",[283,1395,1396,1418,1438,1459,1475,1479],{"__ignoreMap":323},[327,1397,1398,1400,1402,1405,1407,1409,1411,1414,1416],{"class":329,"line":330},[327,1399,334],{"class":333},[327,1401,341],{"class":340},[327,1403,1404],{"class":344}," compose",[327,1406,348],{"class":340},[327,1408,351],{"class":333},[327,1410,354],{"class":340},[327,1412,1413],{"class":357},"@adonisjs\u002Fcore\u002Fhelpers",[327,1415,361],{"class":340},[327,1417,364],{"class":340},[327,1419,1420,1422,1424,1426,1428,1430,1432,1434,1436],{"class":329,"line":367},[327,1421,334],{"class":333},[327,1423,341],{"class":340},[327,1425,1207],{"class":344},[327,1427,348],{"class":340},[327,1429,351],{"class":333},[327,1431,354],{"class":340},[327,1433,1216],{"class":357},[327,1435,361],{"class":340},[327,1437,364],{"class":340},[327,1439,1440,1442,1444,1447,1449,1451,1453,1455,1457],{"class":329,"line":392},[327,1441,334],{"class":333},[327,1443,341],{"class":340},[327,1445,1446],{"class":344}," Filterable",[327,1448,348],{"class":340},[327,1450,351],{"class":333},[327,1452,354],{"class":340},[327,1454,414],{"class":357},[327,1456,361],{"class":340},[327,1458,364],{"class":340},[327,1460,1461,1463,1465,1467,1469,1471,1473],{"class":329,"line":421},[327,1462,334],{"class":333},[327,1464,1227],{"class":344},[327,1466,429],{"class":333},[327,1468,354],{"class":340},[327,1470,1234],{"class":357},[327,1472,361],{"class":340},[327,1474,364],{"class":340},[327,1476,1477],{"class":329,"line":441},[327,1478,445],{"emptyLinePlaceholder":444},[327,1480,1481,1483,1485,1487,1489,1491,1493,1496,1498,1500,1502,1504,1506,1509],{"class":329,"line":448},[327,1482,451],{"class":333},[327,1484,454],{"class":333},[327,1486,458],{"class":457},[327,1488,755],{"class":461},[327,1490,465],{"class":457},[327,1492,1404],{"class":472},[327,1494,1495],{"class":344},"(BaseModel",[327,1497,402],{"class":340},[327,1499,1446],{"class":472},[327,1501,476],{"class":344},[327,1503,479],{"class":340},[327,1505,482],{"class":457},[327,1507,1508],{"class":344}," UserFilterable)) ",[327,1510,1511],{"class":340},"{}\n",[305,1513,1515],{"id":1514},"executing-filtered-queries","Executing Filtered Queries",[279,1517,1518],{},"Once configured, you can build and run filtered queries in several ways:",[1520,1521,1523,1524],"h3",{"id":1522},"_1-from-the-model-via-modelfilter","1. From the Model via ",[283,1525,1526],{},"Model.$filter()",[317,1528,1531],{"className":319,"code":1529,"filename":1530,"language":322,"meta":323,"style":323},"import type { HttpContext } from '@adonisjs\u002Fcore\u002Fhttp';\nimport AdminUserFilterable from '#filters\u002Fadmin_user_filterable';\nimport User from '#models\u002Fuser';\n\nexport default class UsersController {\n  public async index({ request }: HttpContext) {\n    \u002F\u002F Uses the model's default $filterable\n    return await User.$filter(request).paginate(1, 15);\n  }\n\n  public async admins({ request }: HttpContext) {\n    \u002F\u002F Override with a specific Filterable class (or instance)\n    return await User.$filter(AdminUserFilterable, request).paginate(1, 15);\n  }\n}\n","app\u002Fcontrollers\u002Fusers_controller.ts",[283,1532,1533,1556,1574,1590,1594,1607,1632,1637,1679,1683,1687,1708,1713,1752,1756],{"__ignoreMap":323},[327,1534,1535,1537,1539,1541,1544,1546,1548,1550,1552,1554],{"class":329,"line":330},[327,1536,334],{"class":333},[327,1538,337],{"class":333},[327,1540,341],{"class":340},[327,1542,1543],{"class":344}," HttpContext",[327,1545,348],{"class":340},[327,1547,351],{"class":333},[327,1549,354],{"class":340},[327,1551,358],{"class":357},[327,1553,361],{"class":340},[327,1555,364],{"class":340},[327,1557,1558,1560,1563,1565,1567,1570,1572],{"class":329,"line":367},[327,1559,334],{"class":333},[327,1561,1562],{"class":344}," AdminUserFilterable ",[327,1564,429],{"class":333},[327,1566,354],{"class":340},[327,1568,1569],{"class":357},"#filters\u002Fadmin_user_filterable",[327,1571,361],{"class":340},[327,1573,364],{"class":340},[327,1575,1576,1578,1580,1582,1584,1586,1588],{"class":329,"line":392},[327,1577,334],{"class":333},[327,1579,426],{"class":344},[327,1581,429],{"class":333},[327,1583,354],{"class":340},[327,1585,434],{"class":357},[327,1587,361],{"class":340},[327,1589,364],{"class":340},[327,1591,1592],{"class":329,"line":421},[327,1593,445],{"emptyLinePlaceholder":444},[327,1595,1596,1598,1600,1602,1605],{"class":329,"line":441},[327,1597,451],{"class":333},[327,1599,454],{"class":333},[327,1601,458],{"class":457},[327,1603,1604],{"class":461}," UsersController",[327,1606,771],{"class":340},[327,1608,1609,1611,1614,1617,1620,1623,1626,1628,1630],{"class":329,"line":448},[327,1610,501],{"class":457},[327,1612,1613],{"class":457}," async",[327,1615,1616],{"class":504}," index",[327,1618,1619],{"class":340},"({",[327,1621,1622],{"class":743}," request",[327,1624,1625],{"class":340}," }:",[327,1627,1543],{"class":461},[327,1629,560],{"class":340},[327,1631,771],{"class":340},[327,1633,1634],{"class":329,"line":491},[327,1635,1636],{"class":494},"    \u002F\u002F Uses the model's default $filterable\n",[327,1638,1639,1642,1645,1647,1649,1652,1654,1657,1659,1661,1664,1666,1670,1672,1675,1677],{"class":329,"line":498},[327,1640,1641],{"class":333},"    return",[327,1643,1644],{"class":333}," await",[327,1646,755],{"class":344},[327,1648,303],{"class":340},[327,1650,1651],{"class":472},"$filter",[327,1653,476],{"class":504},[327,1655,1656],{"class":344},"request",[327,1658,560],{"class":504},[327,1660,303],{"class":340},[327,1662,1663],{"class":472},"paginate",[327,1665,476],{"class":504},[327,1667,1669],{"class":1668},"sbssI","1",[327,1671,402],{"class":340},[327,1673,1674],{"class":1668}," 15",[327,1676,560],{"class":504},[327,1678,364],{"class":340},[327,1680,1681],{"class":329,"line":514},[327,1682,810],{"class":340},[327,1684,1685],{"class":329,"line":528},[327,1686,445],{"emptyLinePlaceholder":444},[327,1688,1689,1691,1693,1696,1698,1700,1702,1704,1706],{"class":329,"line":540},[327,1690,501],{"class":457},[327,1692,1613],{"class":457},[327,1694,1695],{"class":504}," admins",[327,1697,1619],{"class":340},[327,1699,1622],{"class":743},[327,1701,1625],{"class":340},[327,1703,1543],{"class":461},[327,1705,560],{"class":340},[327,1707,771],{"class":340},[327,1709,1710],{"class":329,"line":565},[327,1711,1712],{"class":494},"    \u002F\u002F Override with a specific Filterable class (or instance)\n",[327,1714,1715,1717,1719,1721,1723,1725,1727,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1750],{"class":329,"line":588},[327,1716,1641],{"class":333},[327,1718,1644],{"class":333},[327,1720,755],{"class":344},[327,1722,303],{"class":340},[327,1724,1651],{"class":472},[327,1726,476],{"class":504},[327,1728,1729],{"class":344},"AdminUserFilterable",[327,1731,402],{"class":340},[327,1733,1622],{"class":344},[327,1735,560],{"class":504},[327,1737,303],{"class":340},[327,1739,1663],{"class":472},[327,1741,476],{"class":504},[327,1743,1669],{"class":1668},[327,1745,402],{"class":340},[327,1747,1674],{"class":1668},[327,1749,560],{"class":504},[327,1751,364],{"class":340},[327,1753,1754],{"class":329,"line":596},[327,1755,810],{"class":340},[327,1757,1758],{"class":329,"line":601},[327,1759,1014],{"class":340},[1520,1761,1763,1764],{"id":1762},"_2-chained-on-an-existing-query-via-queryfilter","2. Chained on an Existing Query via ",[283,1765,1766],{},"query.filter()",[317,1768,1770],{"className":319,"code":1769,"language":322,"meta":323,"style":323},"\u002F\u002F Apply your own constraints before or after calling .filter()\nconst baseQuery = User.query().where('role', 'admin');\nconst activeAdmins = await baseQuery\n  .filter()\n  .paginate(1, 15);\n\n\u002F\u002F Or pass an explicit Filterable class to .filter():\nconst orgQuery = User.query().where('organizationId', orgId);\nconst results = await orgQuery.filter(AdminUserFilterable);\n",[283,1771,1772,1777,1822,1836,1847,1865,1869,1874,1911],{"__ignoreMap":323},[327,1773,1774],{"class":329,"line":330},[327,1775,1776],{"class":494},"\u002F\u002F Apply your own constraints before or after calling .filter()\n",[327,1778,1779,1782,1785,1788,1790,1792,1794,1796,1798,1800,1802,1804,1807,1809,1811,1813,1816,1818,1820],{"class":329,"line":367},[327,1780,1781],{"class":457},"const",[327,1783,1784],{"class":344}," baseQuery ",[327,1786,1787],{"class":340},"=",[327,1789,755],{"class":344},[327,1791,303],{"class":340},[327,1793,744],{"class":472},[327,1795,479],{"class":344},[327,1797,303],{"class":340},[327,1799,785],{"class":472},[327,1801,476],{"class":344},[327,1803,361],{"class":340},[327,1805,1806],{"class":357},"role",[327,1808,361],{"class":340},[327,1810,402],{"class":340},[327,1812,354],{"class":340},[327,1814,1815],{"class":357},"admin",[327,1817,361],{"class":340},[327,1819,560],{"class":344},[327,1821,364],{"class":340},[327,1823,1824,1826,1829,1831,1833],{"class":329,"line":392},[327,1825,1781],{"class":457},[327,1827,1828],{"class":344}," activeAdmins ",[327,1830,1787],{"class":340},[327,1832,1644],{"class":333},[327,1834,1835],{"class":344}," baseQuery\n",[327,1837,1838,1841,1844],{"class":329,"line":421},[327,1839,1840],{"class":340},"  .",[327,1842,1843],{"class":472},"filter",[327,1845,1846],{"class":344},"()\n",[327,1848,1849,1851,1853,1855,1857,1859,1861,1863],{"class":329,"line":441},[327,1850,1840],{"class":340},[327,1852,1663],{"class":472},[327,1854,476],{"class":344},[327,1856,1669],{"class":1668},[327,1858,402],{"class":340},[327,1860,1674],{"class":1668},[327,1862,560],{"class":344},[327,1864,364],{"class":340},[327,1866,1867],{"class":329,"line":448},[327,1868,445],{"emptyLinePlaceholder":444},[327,1870,1871],{"class":329,"line":491},[327,1872,1873],{"class":494},"\u002F\u002F Or pass an explicit Filterable class to .filter():\n",[327,1875,1876,1878,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1902,1904,1906,1909],{"class":329,"line":498},[327,1877,1781],{"class":457},[327,1879,1880],{"class":344}," orgQuery ",[327,1882,1787],{"class":340},[327,1884,755],{"class":344},[327,1886,303],{"class":340},[327,1888,744],{"class":472},[327,1890,479],{"class":344},[327,1892,303],{"class":340},[327,1894,785],{"class":472},[327,1896,476],{"class":344},[327,1898,361],{"class":340},[327,1900,1901],{"class":357},"organizationId",[327,1903,361],{"class":340},[327,1905,402],{"class":340},[327,1907,1908],{"class":344}," orgId)",[327,1910,364],{"class":340},[327,1912,1913,1915,1918,1920,1922,1925,1927,1929,1932],{"class":329,"line":514},[327,1914,1781],{"class":457},[327,1916,1917],{"class":344}," results ",[327,1919,1787],{"class":340},[327,1921,1644],{"class":333},[327,1923,1924],{"class":344}," orgQuery",[327,1926,303],{"class":340},[327,1928,1843],{"class":472},[327,1930,1931],{"class":344},"(AdminUserFilterable)",[327,1933,364],{"class":340},[1520,1935,1937,1938],{"id":1936},"_3-directly-from-the-filterable-class-via-filterablequery","3. Directly from the Filterable Class via ",[283,1939,1940],{},"Filterable.$query()",[279,1942,1943,1944,1947,1948,1951],{},"Because ",[283,1945,1946],{},"UserFilterable"," extends ",[283,1949,1950],{},"BaseFilterable.for(() => User)",", it knows its target model and provides static query helpers:",[317,1953,1955],{"className":319,"code":1954,"language":322,"meta":323,"style":323},"import UserFilterable from '#filters\u002Fuser_filterable';\n\n\u002F\u002F Returns a typed ModelQueryBuilderContract\u003Ctypeof User>\nconst users = await UserFilterable.$query(request).paginate(1, 15);\n\n\u002F\u002F Explicitly validate first and then return the query builder:\nconst query = await UserFilterable.$validateAndQuery(request);\nconst validatedUsers = await query.paginate(1, 15);\n",[283,1956,1957,1973,1977,1982,2019,2023,2028,2050],{"__ignoreMap":323},[327,1958,1959,1961,1963,1965,1967,1969,1971],{"class":329,"line":330},[327,1960,334],{"class":333},[327,1962,1227],{"class":344},[327,1964,429],{"class":333},[327,1966,354],{"class":340},[327,1968,1234],{"class":357},[327,1970,361],{"class":340},[327,1972,364],{"class":340},[327,1974,1975],{"class":329,"line":367},[327,1976,445],{"emptyLinePlaceholder":444},[327,1978,1979],{"class":329,"line":392},[327,1980,1981],{"class":494},"\u002F\u002F Returns a typed ModelQueryBuilderContract\u003Ctypeof User>\n",[327,1983,1984,1986,1989,1991,1993,1995,1997,2000,2003,2005,2007,2009,2011,2013,2015,2017],{"class":329,"line":421},[327,1985,1781],{"class":457},[327,1987,1988],{"class":344}," users ",[327,1990,1787],{"class":340},[327,1992,1644],{"class":333},[327,1994,462],{"class":344},[327,1996,303],{"class":340},[327,1998,1999],{"class":472},"$query",[327,2001,2002],{"class":344},"(request)",[327,2004,303],{"class":340},[327,2006,1663],{"class":472},[327,2008,476],{"class":344},[327,2010,1669],{"class":1668},[327,2012,402],{"class":340},[327,2014,1674],{"class":1668},[327,2016,560],{"class":344},[327,2018,364],{"class":340},[327,2020,2021],{"class":329,"line":441},[327,2022,445],{"emptyLinePlaceholder":444},[327,2024,2025],{"class":329,"line":448},[327,2026,2027],{"class":494},"\u002F\u002F Explicitly validate first and then return the query builder:\n",[327,2029,2030,2032,2035,2037,2039,2041,2043,2046,2048],{"class":329,"line":491},[327,2031,1781],{"class":457},[327,2033,2034],{"class":344}," query ",[327,2036,1787],{"class":340},[327,2038,1644],{"class":333},[327,2040,462],{"class":344},[327,2042,303],{"class":340},[327,2044,2045],{"class":472},"$validateAndQuery",[327,2047,2002],{"class":344},[327,2049,364],{"class":340},[327,2051,2052,2054,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077],{"class":329,"line":498},[327,2053,1781],{"class":457},[327,2055,2056],{"class":344}," validatedUsers ",[327,2058,1787],{"class":340},[327,2060,1644],{"class":333},[327,2062,780],{"class":344},[327,2064,303],{"class":340},[327,2066,1663],{"class":472},[327,2068,476],{"class":344},[327,2070,1669],{"class":1668},[327,2072,402],{"class":340},[327,2074,1674],{"class":1668},[327,2076,560],{"class":344},[327,2078,364],{"class":340},[2080,2081,2082],"style",{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":323,"searchDepth":330,"depth":367,"links":2084},[2085,2086,2087,2088],{"id":307,"depth":367,"text":308},{"id":1050,"depth":367,"text":1051},{"id":1185,"depth":367,"text":1186},{"id":1514,"depth":367,"text":1515,"children":2089},[2090,2092,2094],{"id":1522,"depth":392,"text":2091},"1. From the Model via Model.$filter()",{"id":1762,"depth":392,"text":2093},"2. Chained on an Existing Query via query.filter()",{"id":1936,"depth":392,"text":2095},"3. Directly from the Filterable Class via Filterable.$query()","Encapsulate allowed filters, sorts, includes, setup hooks, and validation rules in dedicated classes.","md",{},{"icon":81},{"title":78,"description":2096},"eb_h9cVzlxcUF133Fjs-Goj6a0ka7sfmrIdluvThZPg",[2103,2105],{"title":73,"path":74,"stem":75,"description":2104,"icon":76,"children":-1},"Eager-load Lucid relationships, nested relations, and relationship counts from API requests.",{"title":83,"path":84,"stem":85,"description":2106,"icon":86,"children":-1},"Validate API query parameters automatically or explicitly using VineJS.",{"id":2108,"extension":2109,"meta":2110,"packages":2111,"stem":2154,"__hash__":2155},"packages\u002Fdata\u002Fpackages.json","json",{},[2112,2119,2125,2131,2136,2142,2148],{"name":2113,"title":2114,"description":2115,"icon":86,"category":2116,"repo":2117,"version":2118,"docs":444},"adonisjs-permission","Permission","Associate users with roles and permissions in your AdonisJS app","adonisjs","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-permission","1.0.0",{"name":2120,"title":2121,"description":2122,"icon":33,"category":2116,"repo":2123,"version":2124,"docs":444},"adonisjs-api-query","API Query","Easily build Lucid queries from API requests","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-api-query","3.0.1",{"name":2126,"title":2127,"description":2128,"icon":249,"category":2116,"repo":2129,"version":2130,"docs":444},"adonisjs-soft-deletes","Soft Deletes","Provider-based Soft deletes for AdonisJS","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-soft-deletes","1.0.2",{"name":2132,"title":195,"description":2133,"icon":196,"category":2116,"repo":2134,"version":2135,"docs":444},"adonisjs-simple-auth","Single API key authentication for AdonisJS v7 applications","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-simple-auth","2.1.0",{"name":2137,"title":2138,"description":2139,"icon":2140,"category":2116,"repo":2141,"docs":22},"adonisjs-sentry","Sentry","Sentry service provider for AdonisJS v7.","i-tabler-bug","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-sentry",{"name":2143,"title":2144,"description":2145,"icon":141,"category":2146,"repo":2147,"docs":22},"eslint-config","ESLint Config","The EienJS ESLint config preset.","tooling","https:\u002F\u002Fgithub.com\u002Feienjs\u002Feslint-config",{"name":2149,"title":2150,"description":2151,"icon":2152,"category":2146,"repo":2153,"docs":22},"adonisjs-pkg-boilerplate","Package Boilerplate","A boilerplate for creating AdonisJS packages.","i-tabler-package","https:\u002F\u002Fgithub.com\u002Feienjs\u002Fadonisjs-pkg-boilerplate","data\u002Fpackages","5fILU7Jigsw2ib-NQg4Fr4sWgIkg0kLgpVm371gTzVY",1793868428848]