[{"data":1,"prerenderedAt":1351},["ShallowReactive",2],{"navigation_docs":3,"-models-relationships":74,"-models-relationships-surround":1346},[4,20,65],{"title":5,"path":6,"stem":7,"children":8,"page":19},"Getting Started","/getting-started","1.getting-started",[9,14],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","/getting-started/introduction","1.getting-started/1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Installation","/getting-started/installation","1.getting-started/2.installation","i-lucide-download",false,{"title":21,"path":22,"stem":23,"children":24,"page":19},"Models","/models","2.models",[25,30,35,40,45,50,55,60],{"title":26,"path":27,"stem":28,"icon":29},"Defining Models","/models/defining-models","2.models/1.defining-models","i-lucide-database",{"title":31,"path":32,"stem":33,"icon":34},"Retrieving Models","/models/retrieving","2.models/2.retrieving","i-lucide-database-search",{"title":36,"path":37,"stem":38,"icon":39},"Inserting & Updating Models","/models/inserting-and-updating","2.models/3.inserting-and-updating","i-lucide-between-horizontal-start",{"title":41,"path":42,"stem":43,"icon":44},"Deleting Models","/models/deleting","2.models/4.deleting","i-lucide-trash",{"title":46,"path":47,"stem":48,"icon":49},"Relationships","/models/relationships","2.models/5.relationships","i-lucide-share-2",{"title":51,"path":52,"stem":53,"icon":54},"Events","/models/events","2.models/6.events","i-lucide-bell",{"title":56,"path":57,"stem":58,"icon":59},"Migrations & Seeders","/models/migrations-and-seeders","2.models/7.migrations-and-seeders","i-lucide-wrench",{"title":61,"path":62,"stem":63,"icon":64},"Transactions","/models/transactions","2.models/8.transactions","i-lucide-git-commit-horizontal",{"title":66,"path":67,"stem":68,"children":69,"page":19},"Contributing","/contributing","3.contributing",[70],{"title":71,"path":72,"stem":73},"Local Development","/contributing/local-development","3.contributing/1.local-development",{"id":75,"title":46,"body":76,"description":1338,"extension":1339,"links":1340,"meta":1341,"navigation":1342,"path":47,"seo":1343,"stem":48,"__hash__":1345},"docs/2.models/5.relationships.md",{"type":77,"value":78,"toc":1330},"minimark",[79,92,97,108,196,253,256,406,411,414,476,479,559,563,566,629,632,776,779,867,871,882,951,954,957,1091,1097,1101,1108,1131,1200,1203,1326],[80,81,82,83,87,88,91],"p",{},"Vasta supports defining relationships between your models. You can define relationships such as ",[84,85,86],"code",{},"hasMany"," and ",[84,89,90],{},"belongsTo"," to easily navigate between related models. Related models can be eager loaded or lazy loaded as needed.",[93,94,96],"h2",{"id":95},"one-to-many-relationships","One-to-Many Relationships",[80,98,99,100,103,104,107],{},"For example, if you have a ",[84,101,102],{},"Person"," model and a ",[84,105,106],{},"Pet"," model, you can define the relationships as follows:",[109,110,115],"pre",{"className":111,"code":112,"language":113,"meta":114,"style":114},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","// In Person model\nget pets() {\n  return this.hasMany(Pet, \"person_id\", \"id\");\n}\n","ts","",[84,116,117,126,144,190],{"__ignoreMap":114},[118,119,122],"span",{"class":120,"line":121},"line",1,[118,123,125],{"class":124},"sHwdD","// In Person model\n",[118,127,129,133,137,140],{"class":120,"line":128},2,[118,130,132],{"class":131},"sTEyZ","get ",[118,134,136],{"class":135},"s2Zo4","pets",[118,138,139],{"class":131},"() ",[118,141,143],{"class":142},"sMK4o","{\n",[118,145,147,151,154,156,160,162,165,168,172,175,177,179,182,184,187],{"class":120,"line":146},3,[118,148,150],{"class":149},"s7zQu","  return",[118,152,153],{"class":142}," this.",[118,155,86],{"class":135},[118,157,159],{"class":158},"swJcz","(",[118,161,106],{"class":131},[118,163,164],{"class":142},",",[118,166,167],{"class":142}," \"",[118,169,171],{"class":170},"sfazB","person_id",[118,173,174],{"class":142},"\"",[118,176,164],{"class":142},[118,178,167],{"class":142},[118,180,181],{"class":170},"id",[118,183,174],{"class":142},[118,185,186],{"class":158},")",[118,188,189],{"class":142},";\n",[118,191,193],{"class":120,"line":192},4,[118,194,195],{"class":142},"}\n",[109,197,199],{"className":111,"code":198,"language":113,"meta":114,"style":114},"// In Pet model\nget owner() {\n  return this.belongsTo(Person, \"person_id\", \"id\");\n}\n",[84,200,201,206,217,249],{"__ignoreMap":114},[118,202,203],{"class":120,"line":121},[118,204,205],{"class":124},"// In Pet model\n",[118,207,208,210,213,215],{"class":120,"line":128},[118,209,132],{"class":131},[118,211,212],{"class":135},"owner",[118,214,139],{"class":131},[118,216,143],{"class":142},[118,218,219,221,223,225,227,229,231,233,235,237,239,241,243,245,247],{"class":120,"line":146},[118,220,150],{"class":149},[118,222,153],{"class":142},[118,224,90],{"class":135},[118,226,159],{"class":158},[118,228,102],{"class":131},[118,230,164],{"class":142},[118,232,167],{"class":142},[118,234,171],{"class":170},[118,236,174],{"class":142},[118,238,164],{"class":142},[118,240,167],{"class":142},[118,242,181],{"class":170},[118,244,174],{"class":142},[118,246,186],{"class":158},[118,248,189],{"class":142},[118,250,251],{"class":120,"line":192},[118,252,195],{"class":142},[80,254,255],{},"You can define multiple relationships between the same models. For example, if you wanted a relationship for a peron's pets, but also a relationship for a person's birds:",[109,257,259],{"className":111,"code":258,"language":113,"meta":114,"style":114},"  // A Person has many Pets\n  get pets() {\n    // We pass the Pet class, and the foreign key column on the pets table\n    return this.hasMany(Pet, \"person_id\", \"id\");\n  }\n  // A person has many birds, which are a subset of their pets\n  get birds() {\n    // we can extend the relationship to get only the person's birds\n    return this.pets.where(\"type\", \"bird\");\n\n    // Alternatively, we could define the birds relationship directly using hasMany\n    // return this.hasMany(Pet, \"person_id\", \"id\").where(\"type\", \"bird\");\n  }\n",[84,260,261,266,277,282,315,321,327,339,345,382,389,395,401],{"__ignoreMap":114},[118,262,263],{"class":120,"line":121},[118,264,265],{"class":124},"  // A Person has many Pets\n",[118,267,268,271,273,275],{"class":120,"line":128},[118,269,270],{"class":131},"  get ",[118,272,136],{"class":135},[118,274,139],{"class":131},[118,276,143],{"class":142},[118,278,279],{"class":120,"line":146},[118,280,281],{"class":124},"    // We pass the Pet class, and the foreign key column on the pets table\n",[118,283,284,287,289,291,293,295,297,299,301,303,305,307,309,311,313],{"class":120,"line":192},[118,285,286],{"class":149},"    return",[118,288,153],{"class":142},[118,290,86],{"class":135},[118,292,159],{"class":158},[118,294,106],{"class":131},[118,296,164],{"class":142},[118,298,167],{"class":142},[118,300,171],{"class":170},[118,302,174],{"class":142},[118,304,164],{"class":142},[118,306,167],{"class":142},[118,308,181],{"class":170},[118,310,174],{"class":142},[118,312,186],{"class":158},[118,314,189],{"class":142},[118,316,318],{"class":120,"line":317},5,[118,319,320],{"class":142},"  }\n",[118,322,324],{"class":120,"line":323},6,[118,325,326],{"class":124},"  // A person has many birds, which are a subset of their pets\n",[118,328,330,332,335,337],{"class":120,"line":329},7,[118,331,270],{"class":131},[118,333,334],{"class":135},"birds",[118,336,139],{"class":131},[118,338,143],{"class":142},[118,340,342],{"class":120,"line":341},8,[118,343,344],{"class":124},"    // we can extend the relationship to get only the person's birds\n",[118,346,348,350,352,354,357,360,362,364,367,369,371,373,376,378,380],{"class":120,"line":347},9,[118,349,286],{"class":149},[118,351,153],{"class":142},[118,353,136],{"class":131},[118,355,356],{"class":142},".",[118,358,359],{"class":135},"where",[118,361,159],{"class":158},[118,363,174],{"class":142},[118,365,366],{"class":170},"type",[118,368,174],{"class":142},[118,370,164],{"class":142},[118,372,167],{"class":142},[118,374,375],{"class":170},"bird",[118,377,174],{"class":142},[118,379,186],{"class":158},[118,381,189],{"class":142},[118,383,385],{"class":120,"line":384},10,[118,386,388],{"emptyLinePlaceholder":387},true,"\n",[118,390,392],{"class":120,"line":391},11,[118,393,394],{"class":124},"    // Alternatively, we could define the birds relationship directly using hasMany\n",[118,396,398],{"class":120,"line":397},12,[118,399,400],{"class":124},"    // return this.hasMany(Pet, \"person_id\", \"id\").where(\"type\", \"bird\");\n",[118,402,404],{"class":120,"line":403},13,[118,405,320],{"class":142},[407,408,410],"h3",{"id":409},"lazy-loading","Lazy Loading",[80,412,413],{},"You can lazy-load a person's pets or a pet's owner:",[109,415,417],{"className":111,"code":416,"language":113,"meta":114,"style":114},"const person = await Person.find(1);\nconst pets = await person.pets; // Get all pets belonging to the person\n",[84,418,419,452],{"__ignoreMap":114},[118,420,421,425,428,431,434,437,439,442,444,448,450],{"class":120,"line":121},[118,422,424],{"class":423},"spNyl","const",[118,426,427],{"class":131}," person ",[118,429,430],{"class":142},"=",[118,432,433],{"class":149}," await",[118,435,436],{"class":131}," Person",[118,438,356],{"class":142},[118,440,441],{"class":135},"find",[118,443,159],{"class":131},[118,445,447],{"class":446},"sbssI","1",[118,449,186],{"class":131},[118,451,189],{"class":142},[118,453,454,456,459,461,463,466,468,470,473],{"class":120,"line":128},[118,455,424],{"class":423},[118,457,458],{"class":131}," pets ",[118,460,430],{"class":142},[118,462,433],{"class":149},[118,464,465],{"class":131}," person",[118,467,356],{"class":142},[118,469,136],{"class":131},[118,471,472],{"class":142},";",[118,474,475],{"class":124}," // Get all pets belonging to the person\n",[80,477,478],{},"Lazy loaded relationship queries can be constrained:",[109,480,482],{"className":111,"code":481,"language":113,"meta":114,"style":114},"const person = await Person.findOrFail(3);\nconst bird = await person.pets.where(\"type\", \"bird\").first();\n",[84,483,484,510],{"__ignoreMap":114},[118,485,486,488,490,492,494,496,498,501,503,506,508],{"class":120,"line":121},[118,487,424],{"class":423},[118,489,427],{"class":131},[118,491,430],{"class":142},[118,493,433],{"class":149},[118,495,436],{"class":131},[118,497,356],{"class":142},[118,499,500],{"class":135},"findOrFail",[118,502,159],{"class":131},[118,504,505],{"class":446},"3",[118,507,186],{"class":131},[118,509,189],{"class":142},[118,511,512,514,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,554,557],{"class":120,"line":128},[118,513,424],{"class":423},[118,515,516],{"class":131}," bird ",[118,518,430],{"class":142},[118,520,433],{"class":149},[118,522,465],{"class":131},[118,524,356],{"class":142},[118,526,136],{"class":131},[118,528,356],{"class":142},[118,530,359],{"class":135},[118,532,159],{"class":131},[118,534,174],{"class":142},[118,536,366],{"class":170},[118,538,174],{"class":142},[118,540,164],{"class":142},[118,542,167],{"class":142},[118,544,375],{"class":170},[118,546,174],{"class":142},[118,548,186],{"class":131},[118,550,356],{"class":142},[118,552,553],{"class":135},"first",[118,555,556],{"class":131},"()",[118,558,189],{"class":142},[407,560,562],{"id":561},"eager-loading","Eager Loading",[80,564,565],{},"You can also eager load relationships to optimize your queries:",[109,567,569],{"className":111,"code":568,"language":113,"meta":114,"style":114},"const person = await Person.with(\"pets\").find(1);\nconst pets = person.pets; // This will not trigger a new query, as the pets were eager loaded\n",[84,570,571,610],{"__ignoreMap":114},[118,572,573,575,577,579,581,583,585,588,590,592,594,596,598,600,602,604,606,608],{"class":120,"line":121},[118,574,424],{"class":423},[118,576,427],{"class":131},[118,578,430],{"class":142},[118,580,433],{"class":149},[118,582,436],{"class":131},[118,584,356],{"class":142},[118,586,587],{"class":135},"with",[118,589,159],{"class":131},[118,591,174],{"class":142},[118,593,136],{"class":170},[118,595,174],{"class":142},[118,597,186],{"class":131},[118,599,356],{"class":142},[118,601,441],{"class":135},[118,603,159],{"class":131},[118,605,447],{"class":446},[118,607,186],{"class":131},[118,609,189],{"class":142},[118,611,612,614,616,618,620,622,624,626],{"class":120,"line":128},[118,613,424],{"class":423},[118,615,458],{"class":131},[118,617,430],{"class":142},[118,619,465],{"class":131},[118,621,356],{"class":142},[118,623,136],{"class":131},[118,625,472],{"class":142},[118,627,628],{"class":124}," // This will not trigger a new query, as the pets were eager loaded\n",[80,630,631],{},"When eager loading, you can also add custom constraints to the relationship query. Pass an object mapping the relationship name to a callback function receiving the query builder:",[109,633,635],{"className":111,"code":634,"language":113,"meta":114,"style":114},"// Eager load only pets that are cats, sorting them by name\nconst person = await Person.with({\n  pets: (query) => query.where(\"type\", \"cat\").orderBy(\"name\", \"desc\"),\n}).find(1);\n\nconst catsOnly = person.pets;\n",[84,636,637,642,662,736,755,759],{"__ignoreMap":114},[118,638,639],{"class":120,"line":121},[118,640,641],{"class":124},"// Eager load only pets that are cats, sorting them by name\n",[118,643,644,646,648,650,652,654,656,658,660],{"class":120,"line":128},[118,645,424],{"class":423},[118,647,427],{"class":131},[118,649,430],{"class":142},[118,651,433],{"class":149},[118,653,436],{"class":131},[118,655,356],{"class":142},[118,657,587],{"class":135},[118,659,159],{"class":131},[118,661,143],{"class":142},[118,663,664,667,670,673,677,679,682,685,687,689,691,693,695,697,699,701,704,706,708,710,713,715,717,720,722,724,726,729,731,733],{"class":120,"line":146},[118,665,666],{"class":135},"  pets",[118,668,669],{"class":142},":",[118,671,672],{"class":142}," (",[118,674,676],{"class":675},"sHdIc","query",[118,678,186],{"class":142},[118,680,681],{"class":423}," =>",[118,683,684],{"class":131}," query",[118,686,356],{"class":142},[118,688,359],{"class":135},[118,690,159],{"class":131},[118,692,174],{"class":142},[118,694,366],{"class":170},[118,696,174],{"class":142},[118,698,164],{"class":142},[118,700,167],{"class":142},[118,702,703],{"class":170},"cat",[118,705,174],{"class":142},[118,707,186],{"class":131},[118,709,356],{"class":142},[118,711,712],{"class":135},"orderBy",[118,714,159],{"class":131},[118,716,174],{"class":142},[118,718,719],{"class":170},"name",[118,721,174],{"class":142},[118,723,164],{"class":142},[118,725,167],{"class":142},[118,727,728],{"class":170},"desc",[118,730,174],{"class":142},[118,732,186],{"class":131},[118,734,735],{"class":142},",\n",[118,737,738,741,743,745,747,749,751,753],{"class":120,"line":192},[118,739,740],{"class":142},"}",[118,742,186],{"class":131},[118,744,356],{"class":142},[118,746,441],{"class":135},[118,748,159],{"class":131},[118,750,447],{"class":446},[118,752,186],{"class":131},[118,754,189],{"class":142},[118,756,757],{"class":120,"line":317},[118,758,388],{"emptyLinePlaceholder":387},[118,760,761,763,766,768,770,772,774],{"class":120,"line":323},[118,762,424],{"class":423},[118,764,765],{"class":131}," catsOnly ",[118,767,430],{"class":142},[118,769,465],{"class":131},[118,771,356],{"class":142},[118,773,136],{"class":131},[118,775,189],{"class":142},[80,777,778],{},"You can even combine multiple eager loads with and without constraints in the same call:",[109,780,782],{"className":111,"code":781,"language":113,"meta":114,"style":114},"const people = await Person.with(\"vehicles\", { pets: (query) => query.where(\"type\", \"dog\") }).get();\n",[84,783,784],{"__ignoreMap":114},[118,785,786,788,791,793,795,797,799,801,803,805,808,810,812,815,818,820,822,824,826,828,830,832,834,836,838,840,842,844,846,849,851,854,856,858,860,863,865],{"class":120,"line":121},[118,787,424],{"class":423},[118,789,790],{"class":131}," people ",[118,792,430],{"class":142},[118,794,433],{"class":149},[118,796,436],{"class":131},[118,798,356],{"class":142},[118,800,587],{"class":135},[118,802,159],{"class":131},[118,804,174],{"class":142},[118,806,807],{"class":170},"vehicles",[118,809,174],{"class":142},[118,811,164],{"class":142},[118,813,814],{"class":142}," {",[118,816,817],{"class":135}," pets",[118,819,669],{"class":142},[118,821,672],{"class":142},[118,823,676],{"class":675},[118,825,186],{"class":142},[118,827,681],{"class":423},[118,829,684],{"class":131},[118,831,356],{"class":142},[118,833,359],{"class":135},[118,835,159],{"class":131},[118,837,174],{"class":142},[118,839,366],{"class":170},[118,841,174],{"class":142},[118,843,164],{"class":142},[118,845,167],{"class":142},[118,847,848],{"class":170},"dog",[118,850,174],{"class":142},[118,852,853],{"class":131},") ",[118,855,740],{"class":142},[118,857,186],{"class":131},[118,859,356],{"class":142},[118,861,862],{"class":135},"get",[118,864,556],{"class":131},[118,866,189],{"class":142},[407,868,870],{"id":869},"counting-related-records","Counting Related Records",[80,872,873,874,877,878,881],{},"If you only need the number of related records, use ",[84,875,876],{},"withCount"," instead of loading the full relationship. Each result gets a ",[84,879,880],{},"{relation}Count"," attribute containing the count:",[109,883,885],{"className":111,"code":884,"language":113,"meta":114,"style":114},"// Get people with a count of their pets\nconst people = await Person.withCount(\"pets\").get();\n\npeople[0].petsCount; // number\n",[84,886,887,892,926,930],{"__ignoreMap":114},[118,888,889],{"class":120,"line":121},[118,890,891],{"class":124},"// Get people with a count of their pets\n",[118,893,894,896,898,900,902,904,906,908,910,912,914,916,918,920,922,924],{"class":120,"line":128},[118,895,424],{"class":423},[118,897,790],{"class":131},[118,899,430],{"class":142},[118,901,433],{"class":149},[118,903,436],{"class":131},[118,905,356],{"class":142},[118,907,876],{"class":135},[118,909,159],{"class":131},[118,911,174],{"class":142},[118,913,136],{"class":170},[118,915,174],{"class":142},[118,917,186],{"class":131},[118,919,356],{"class":142},[118,921,862],{"class":135},[118,923,556],{"class":131},[118,925,189],{"class":142},[118,927,928],{"class":120,"line":146},[118,929,388],{"emptyLinePlaceholder":387},[118,931,932,935,938,941,943,946,948],{"class":120,"line":192},[118,933,934],{"class":131},"people[",[118,936,937],{"class":446},"0",[118,939,940],{"class":131},"]",[118,942,356],{"class":142},[118,944,945],{"class":131},"petsCount",[118,947,472],{"class":142},[118,949,950],{"class":124}," // number\n",[80,952,953],{},"The count is computed in the same query as the main results using a subquery, so no extra queries are run.",[80,955,956],{},"You can count multiple relationships at once, and add constraints to the counting query by passing an object mapping the relationship name to a callback:",[109,958,960],{"className":111,"code":959,"language":113,"meta":114,"style":114},"// Count all visits, plus only the visits to vet #1\nconst pets = await Pet.withCount(\"vets\", {\n  vetVisits: (query) => query.where(\"vet_id\", 1),\n}).get();\n\npets[0].vetsCount; // number\npets[0].vetVisitsCount; // number of visits matching the constraint\n",[84,961,962,967,998,1037,1051,1055,1073],{"__ignoreMap":114},[118,963,964],{"class":120,"line":121},[118,965,966],{"class":124},"// Count all visits, plus only the visits to vet #1\n",[118,968,969,971,973,975,977,980,982,984,986,988,991,993,995],{"class":120,"line":128},[118,970,424],{"class":423},[118,972,458],{"class":131},[118,974,430],{"class":142},[118,976,433],{"class":149},[118,978,979],{"class":131}," Pet",[118,981,356],{"class":142},[118,983,876],{"class":135},[118,985,159],{"class":131},[118,987,174],{"class":142},[118,989,990],{"class":170},"vets",[118,992,174],{"class":142},[118,994,164],{"class":142},[118,996,997],{"class":142}," {\n",[118,999,1000,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1026,1028,1030,1033,1035],{"class":120,"line":146},[118,1001,1002],{"class":135},"  vetVisits",[118,1004,669],{"class":142},[118,1006,672],{"class":142},[118,1008,676],{"class":675},[118,1010,186],{"class":142},[118,1012,681],{"class":423},[118,1014,684],{"class":131},[118,1016,356],{"class":142},[118,1018,359],{"class":135},[118,1020,159],{"class":131},[118,1022,174],{"class":142},[118,1024,1025],{"class":170},"vet_id",[118,1027,174],{"class":142},[118,1029,164],{"class":142},[118,1031,1032],{"class":446}," 1",[118,1034,186],{"class":131},[118,1036,735],{"class":142},[118,1038,1039,1041,1043,1045,1047,1049],{"class":120,"line":192},[118,1040,740],{"class":142},[118,1042,186],{"class":131},[118,1044,356],{"class":142},[118,1046,862],{"class":135},[118,1048,556],{"class":131},[118,1050,189],{"class":142},[118,1052,1053],{"class":120,"line":317},[118,1054,388],{"emptyLinePlaceholder":387},[118,1056,1057,1060,1062,1064,1066,1069,1071],{"class":120,"line":323},[118,1058,1059],{"class":131},"pets[",[118,1061,937],{"class":446},[118,1063,940],{"class":131},[118,1065,356],{"class":142},[118,1067,1068],{"class":131},"vetsCount",[118,1070,472],{"class":142},[118,1072,950],{"class":124},[118,1074,1075,1077,1079,1081,1083,1086,1088],{"class":120,"line":329},[118,1076,1059],{"class":131},[118,1078,937],{"class":446},[118,1080,940],{"class":131},[118,1082,356],{"class":142},[118,1084,1085],{"class":131},"vetVisitsCount",[118,1087,472],{"class":142},[118,1089,1090],{"class":124}," // number of visits matching the constraint\n",[80,1092,1093,1094,356],{},"Counts are included when serializing the model with ",[84,1095,1096],{},"toJSON()",[93,1098,1100],{"id":1099},"many-to-many-relationships","Many-to-Many Relationships",[80,1102,1103,1104,1107],{},"You can define many-to-many relationships using the ",[84,1105,1106],{},"belongsToMany"," method. This requires a pivot table (or join table) to link the two models together.",[80,1109,1110,1111,1113,1114,1117,1118,1120,1121,1123,1124,1127,1128,1130],{},"For example, if a ",[84,1112,106],{}," can visit many ",[84,1115,1116],{},"Vet","s, and a ",[84,1119,1116],{}," can see many ",[84,1122,106],{},"s, you might use a ",[84,1125,1126],{},"vet_visits"," join table. You can define the relationship on the ",[84,1129,106],{}," model like this:",[109,1132,1134],{"className":111,"code":1133,"language":113,"meta":114,"style":114},"// In Pet model\nget vets() {\n  // belongsToMany(RelatedModel, pivotTable, foreignPivotKey, relatedPivotKey)\n  return this.belongsToMany(Vet, \"vet_visits\", \"pet_id\", \"vet_id\");\n}\n",[84,1135,1136,1140,1150,1155,1196],{"__ignoreMap":114},[118,1137,1138],{"class":120,"line":121},[118,1139,205],{"class":124},[118,1141,1142,1144,1146,1148],{"class":120,"line":128},[118,1143,132],{"class":131},[118,1145,990],{"class":135},[118,1147,139],{"class":131},[118,1149,143],{"class":142},[118,1151,1152],{"class":120,"line":146},[118,1153,1154],{"class":124},"  // belongsToMany(RelatedModel, pivotTable, foreignPivotKey, relatedPivotKey)\n",[118,1156,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1182,1184,1186,1188,1190,1192,1194],{"class":120,"line":192},[118,1158,150],{"class":149},[118,1160,153],{"class":142},[118,1162,1106],{"class":135},[118,1164,159],{"class":158},[118,1166,1116],{"class":131},[118,1168,164],{"class":142},[118,1170,167],{"class":142},[118,1172,1126],{"class":170},[118,1174,174],{"class":142},[118,1176,164],{"class":142},[118,1178,167],{"class":142},[118,1180,1181],{"class":170},"pet_id",[118,1183,174],{"class":142},[118,1185,164],{"class":142},[118,1187,167],{"class":142},[118,1189,1025],{"class":170},[118,1191,174],{"class":142},[118,1193,186],{"class":158},[118,1195,189],{"class":142},[118,1197,1198],{"class":120,"line":317},[118,1199,195],{"class":142},[80,1201,1202],{},"You can interact with a many-to-many relationship just like any other, choosing to either eager load or lazy load the related models:",[109,1204,1206],{"className":111,"code":1205,"language":113,"meta":114,"style":114},"// Lazy loading\nconst pet = await Pet.find(1);\nconst vets = await pet.vets; // Get all vets this pet has visited\n\n// Eager loading\nconst pets = await Pet.with(\"vets\").get();\nconst firstPetVets = pets[0].vets;\n",[84,1207,1208,1213,1238,1261,1265,1270,1304],{"__ignoreMap":114},[118,1209,1210],{"class":120,"line":121},[118,1211,1212],{"class":124},"// Lazy loading\n",[118,1214,1215,1217,1220,1222,1224,1226,1228,1230,1232,1234,1236],{"class":120,"line":128},[118,1216,424],{"class":423},[118,1218,1219],{"class":131}," pet ",[118,1221,430],{"class":142},[118,1223,433],{"class":149},[118,1225,979],{"class":131},[118,1227,356],{"class":142},[118,1229,441],{"class":135},[118,1231,159],{"class":131},[118,1233,447],{"class":446},[118,1235,186],{"class":131},[118,1237,189],{"class":142},[118,1239,1240,1242,1245,1247,1249,1252,1254,1256,1258],{"class":120,"line":146},[118,1241,424],{"class":423},[118,1243,1244],{"class":131}," vets ",[118,1246,430],{"class":142},[118,1248,433],{"class":149},[118,1250,1251],{"class":131}," pet",[118,1253,356],{"class":142},[118,1255,990],{"class":131},[118,1257,472],{"class":142},[118,1259,1260],{"class":124}," // Get all vets this pet has visited\n",[118,1262,1263],{"class":120,"line":192},[118,1264,388],{"emptyLinePlaceholder":387},[118,1266,1267],{"class":120,"line":317},[118,1268,1269],{"class":124},"// Eager loading\n",[118,1271,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302],{"class":120,"line":323},[118,1273,424],{"class":423},[118,1275,458],{"class":131},[118,1277,430],{"class":142},[118,1279,433],{"class":149},[118,1281,979],{"class":131},[118,1283,356],{"class":142},[118,1285,587],{"class":135},[118,1287,159],{"class":131},[118,1289,174],{"class":142},[118,1291,990],{"class":170},[118,1293,174],{"class":142},[118,1295,186],{"class":131},[118,1297,356],{"class":142},[118,1299,862],{"class":135},[118,1301,556],{"class":131},[118,1303,189],{"class":142},[118,1305,1306,1308,1311,1313,1316,1318,1320,1322,1324],{"class":120,"line":329},[118,1307,424],{"class":423},[118,1309,1310],{"class":131}," firstPetVets ",[118,1312,430],{"class":142},[118,1314,1315],{"class":131}," pets[",[118,1317,937],{"class":446},[118,1319,940],{"class":131},[118,1321,356],{"class":142},[118,1323,990],{"class":131},[118,1325,189],{"class":142},[1327,1328,1329],"style",{},"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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}",{"title":114,"searchDepth":128,"depth":128,"links":1331},[1332,1337],{"id":95,"depth":128,"text":96,"children":1333},[1334,1335,1336],{"id":409,"depth":146,"text":410},{"id":561,"depth":146,"text":562},{"id":869,"depth":146,"text":870},{"id":1099,"depth":128,"text":1100},"Defining relationships between models with Vasta.","md",null,{},{"icon":49},{"description":1344,"title":46},"Learn how to define relationships between models with Vasta.","v9MC9Tg121X34r4S43wn9f3izYbu1UH5Q0tlP02qHMQ",[1347,1349],{"title":41,"path":42,"stem":43,"description":1348,"icon":44,"children":-1},"Deleting models with Vasta.",{"title":51,"path":52,"stem":53,"description":1350,"icon":54,"children":-1},"Defining lifecycle events for models with Vasta.",1784320847711]