[{"data":1,"prerenderedAt":2835},["ShallowReactive",2],{"navigation":3,"\u002Fapi\u002Fproduct":72,"\u002Fapi\u002Fproduct-surround":2830},[4,42,55],{"title":5,"path":6,"stem":7,"children":8,"page":41},"Api","\u002Fapi","api",[9,13,17,21,25,29,33,37],{"title":10,"path":11,"stem":12},"Cart API","\u002Fapi\u002Fcart","api\u002Fcart",{"title":14,"path":15,"stem":16},"Category API","\u002Fapi\u002Fcategory","api\u002Fcategory",{"title":18,"path":19,"stem":20},"Checkout API","\u002Fapi\u002Fcheckout","api\u002Fcheckout",{"title":22,"path":23,"stem":24},"Inventory","\u002Fapi\u002Finventory","api\u002Finventory",{"title":26,"path":27,"stem":28},"Order Numbers","\u002Fapi\u002Forder-numbers","api\u002Forder-numbers",{"title":30,"path":31,"stem":32},"Product API","\u002Fapi\u002Fproduct","api\u002Fproduct",{"title":34,"path":35,"stem":36},"Promotions API","\u002Fapi\u002Fpromotions","api\u002Fpromotions",{"title":38,"path":39,"stem":40},"Taxes","\u002Fapi\u002Ftaxes","api\u002Ftaxes",false,{"title":43,"path":44,"stem":45,"children":46,"page":41},"Getting Started","\u002Fgetting-started","getting-started",[47,51],{"title":48,"path":49,"stem":50},"Admin panel","\u002Fgetting-started\u002Fadmin-panel","getting-started\u002Fadmin-panel",{"title":52,"path":53,"stem":54},"Installation","\u002Fgetting-started\u002Finstallation","getting-started\u002Finstallation",{"title":56,"path":57,"stem":58,"children":59,"page":41},"Tasks","\u002Ftasks","tasks",[60,64,68],{"title":61,"path":62,"stem":63},"Building A Navigation","\u002Ftasks\u002Fbuilding-a-navigation","tasks\u002Fbuilding-a-navigation",{"title":65,"path":66,"stem":67},"Product Detail Page","\u002Ftasks\u002Fproduct-detail-page","tasks\u002Fproduct-detail-page",{"title":69,"path":70,"stem":71},"Product Listing Page","\u002Ftasks\u002Fproduct-listing-page","tasks\u002Fproduct-listing-page",{"id":73,"title":30,"body":74,"description":2824,"extension":2825,"links":2826,"meta":2827,"navigation":193,"path":31,"seo":2828,"stem":32,"__hash__":2829},"docs\u002Fapi\u002Fproduct.md",{"type":75,"value":76,"toc":2815},"minimark",[77,81,85,101,112,128,454,469,514,568,906,912,917,931,1042,1046,1052,1109,1118,1122,1128,1181,1184,1265,1269,1275,1304,1311,1319,1322,1326,1333,1340,1362,1365,1368,1509,1516,1670,1673,1724,1731,1814,1818,1842,2103,2106,2243,2250,2253,2353,2377,2380,2383,2541,2547,2683,2687,2693,2776,2782,2811],[78,79,30],"h1",{"id":80},"product-api",[82,83,84],"p",{},"The product model exposes relationships and query helpers for building\nstorefront product listing and detail pages.",[82,86,87,88,92,93,96,97,100],{},"Products include a nullable, translatable ",[89,90,91],"code",{},"description"," field for longer\nplain-text product copy. Like ",[89,94,95],{},"name",", it is cast to ",[89,98,99],{},"Translatable"," when set.",[82,102,103,104,107,108,111],{},"Products must also include a currency-independent ",[89,105,106],{},"price"," field. Price values\nare integer strings in minor units and are cast to ",[89,109,110],{},"Larasell\\Larasell\\Price","\non the model. Supply the cart or order currency when formatting a price.",[82,113,114,115,118,119,121,122,124,125,127],{},"Products may also include a nullable ",[89,116,117],{},"compare_at"," field with the same shape.\nIt is a display-only previous price in the same tax mode as ",[89,120,106],{},". Carts,\ntaxes, and promotions ignore it. A product is on sale when ",[89,123,117],{}," is\nhigher than ",[89,126,106],{},". Values that are missing, equal, or lower are stored but\nare not treated as a sale.",[129,130,135],"pre",{"className":131,"code":132,"language":133,"meta":134,"style":134},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","use Larasell\\Larasell\\Models\\Product;\nuse Larasell\\Larasell\\Price;\n\n$product = Product::create([\n    'slug' => 'basic-plan',\n    'name' => 'Basic Plan',\n    'sku' => 'PLAN-BASIC',\n    'barcode' => null,\n    'price' => Price::of(1299),\n    'compare_at' => Price::of(1999),\n]);\n\n$amount = $product->price->amount();\n$formatted = Price::format($product->price, 'USD');\n$product->onSale(); \u002F\u002F true\n","php","",[89,136,137,170,188,195,221,248,268,289,304,332,356,362,367,396,435],{"__ignoreMap":134},[138,139,142,146,150,154,157,159,162,164,167],"span",{"class":140,"line":141},"line",1,[138,143,145],{"class":144},"sbssI","use",[138,147,149],{"class":148},"sTEyZ"," Larasell",[138,151,153],{"class":152},"sMK4o","\\",[138,155,156],{"class":148},"Larasell",[138,158,153],{"class":152},[138,160,161],{"class":148},"Models",[138,163,153],{"class":152},[138,165,166],{"class":148},"Product",[138,168,169],{"class":152},";\n",[138,171,173,175,177,179,181,183,186],{"class":140,"line":172},2,[138,174,145],{"class":144},[138,176,149],{"class":148},[138,178,153],{"class":152},[138,180,156],{"class":148},[138,182,153],{"class":152},[138,184,185],{"class":148},"Price",[138,187,169],{"class":152},[138,189,191],{"class":140,"line":190},3,[138,192,194],{"emptyLinePlaceholder":193},true,"\n",[138,196,198,201,204,207,211,214,218],{"class":140,"line":197},4,[138,199,200],{"class":152},"$",[138,202,203],{"class":148},"product ",[138,205,206],{"class":152},"=",[138,208,210],{"class":209},"sBMFI"," Product",[138,212,213],{"class":152},"::",[138,215,217],{"class":216},"s2Zo4","create",[138,219,220],{"class":152},"([\n",[138,222,224,227,231,234,237,240,243,245],{"class":140,"line":223},5,[138,225,226],{"class":152},"    '",[138,228,230],{"class":229},"sfazB","slug",[138,232,233],{"class":152},"'",[138,235,236],{"class":152}," =>",[138,238,239],{"class":152}," '",[138,241,242],{"class":229},"basic-plan",[138,244,233],{"class":152},[138,246,247],{"class":152},",\n",[138,249,251,253,255,257,259,261,264,266],{"class":140,"line":250},6,[138,252,226],{"class":152},[138,254,95],{"class":229},[138,256,233],{"class":152},[138,258,236],{"class":152},[138,260,239],{"class":152},[138,262,263],{"class":229},"Basic Plan",[138,265,233],{"class":152},[138,267,247],{"class":152},[138,269,271,273,276,278,280,282,285,287],{"class":140,"line":270},7,[138,272,226],{"class":152},[138,274,275],{"class":229},"sku",[138,277,233],{"class":152},[138,279,236],{"class":152},[138,281,239],{"class":152},[138,283,284],{"class":229},"PLAN-BASIC",[138,286,233],{"class":152},[138,288,247],{"class":152},[138,290,292,294,297,299,301],{"class":140,"line":291},8,[138,293,226],{"class":152},[138,295,296],{"class":229},"barcode",[138,298,233],{"class":152},[138,300,236],{"class":152},[138,302,303],{"class":152}," null,\n",[138,305,307,309,311,313,315,318,320,323,326,329],{"class":140,"line":306},9,[138,308,226],{"class":152},[138,310,106],{"class":229},[138,312,233],{"class":152},[138,314,236],{"class":152},[138,316,317],{"class":209}," Price",[138,319,213],{"class":152},[138,321,322],{"class":216},"of",[138,324,325],{"class":152},"(",[138,327,328],{"class":144},"1299",[138,330,331],{"class":152},"),\n",[138,333,335,337,339,341,343,345,347,349,351,354],{"class":140,"line":334},10,[138,336,226],{"class":152},[138,338,117],{"class":229},[138,340,233],{"class":152},[138,342,236],{"class":152},[138,344,317],{"class":209},[138,346,213],{"class":152},[138,348,322],{"class":216},[138,350,325],{"class":152},[138,352,353],{"class":144},"1999",[138,355,331],{"class":152},[138,357,359],{"class":140,"line":358},11,[138,360,361],{"class":152},"]);\n",[138,363,365],{"class":140,"line":364},12,[138,366,194],{"emptyLinePlaceholder":193},[138,368,370,372,375,377,380,383,386,388,390,393],{"class":140,"line":369},13,[138,371,200],{"class":152},[138,373,374],{"class":148},"amount ",[138,376,206],{"class":152},[138,378,379],{"class":152}," $",[138,381,382],{"class":148},"product",[138,384,385],{"class":152},"->",[138,387,106],{"class":148},[138,389,385],{"class":152},[138,391,392],{"class":216},"amount",[138,394,395],{"class":152},"();\n",[138,397,399,401,404,406,408,410,413,416,418,420,422,425,427,430,432],{"class":140,"line":398},14,[138,400,200],{"class":152},[138,402,403],{"class":148},"formatted ",[138,405,206],{"class":152},[138,407,317],{"class":209},[138,409,213],{"class":152},[138,411,412],{"class":216},"format",[138,414,415],{"class":152},"($",[138,417,382],{"class":148},[138,419,385],{"class":152},[138,421,106],{"class":148},[138,423,424],{"class":152},",",[138,426,239],{"class":152},[138,428,429],{"class":229},"USD",[138,431,233],{"class":152},[138,433,434],{"class":152},");\n",[138,436,438,440,442,444,447,450],{"class":140,"line":437},15,[138,439,200],{"class":152},[138,441,382],{"class":148},[138,443,385],{"class":152},[138,445,446],{"class":216},"onSale",[138,448,449],{"class":152},"();",[138,451,453],{"class":452},"sHwdD"," \u002F\u002F true\n",[82,455,456,457,459,460,462,463,465,466,468],{},"Products may have a nullable ",[89,458,275],{}," and ",[89,461,296],{},". Both identifiers are stored\nas strings, preserve leading zeroes, and must be unique when present. Use ",[89,464,275],{},"\nfor the merchant's internal stock identifier and ",[89,467,296],{}," for an external\nidentifier such as an EAN, UPC, or GTIN.",[82,470,471,472,475,476,479,480,482,483,485,486,489,490,493,494,459,497,500,501,503,504,507,508,510,511,513],{},"Products include a nullable ",[89,473,474],{},"stock"," field that defaults to ",[89,477,478],{},"null",".\nWhen ",[89,481,474],{}," is ",[89,484,478],{},", Larasell does not track inventory for the\nproduct and customers may buy any quantity. By default, products also\nallow backorders, which means products with a finite stock can be\npurchased even when stock would go below zero. Set ",[89,487,488],{},"allow_backorders"," to\n",[89,491,492],{},"false"," when a product should stop selling once stock reaches zero.\nProducts can also define nullable ",[89,495,496],{},"min_quantity",[89,498,499],{},"max_quantity","\nfields. Both default to ",[89,502,478],{},". When set, each value must be at least\n",[89,505,506],{},"1",", and ",[89,509,496],{}," cannot exceed ",[89,512,499],{},".",[82,515,516,517,520,521,524,525,528,529,528,532,528,535,538,539,528,542,528,545,528,548,247,551,554,555,558,559,459,562,558,565,513],{},"Products may include a nullable ",[89,518,519],{},"weight"," and nullable ",[89,522,523],{},"dimensions"," value.\nWeight stores an amount and unit (",[89,526,527],{},"g",", ",[89,530,531],{},"kg",[89,533,534],{},"oz",[89,536,537],{},"lb","). Dimensions store\nlength, width, height, and a shared length unit (",[89,540,541],{},"mm",[89,543,544],{},"cm",[89,546,547],{},"m",[89,549,550],{},"in",[89,552,553],{},"ft","). Amounts are non-negative decimal strings. Comparisons convert to a\ncanonical unit, so ",[89,556,557],{},"1 kg"," equals ",[89,560,561],{},"1000 g",[89,563,564],{},"1 in",[89,566,567],{},"25.4 mm",[129,569,571],{"className":131,"code":570,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Dimensions;\nuse Larasell\\Larasell\\Enums\\LengthUnit;\nuse Larasell\\Larasell\\Enums\\WeightUnit;\nuse Larasell\\Larasell\\Length;\nuse Larasell\\Larasell\\Weight;\n\n$product->update([\n    'weight' => Weight::of(450, WeightUnit::Gram),\n    'dimensions' => Dimensions::of(30, 20, 2, LengthUnit::Centimeter),\n]);\n\n$product->weight->greaterThan(Weight::of('0.4', WeightUnit::Kilogram));\n$product->dimensions->longestSide()->lessThan(Length::of(1, LengthUnit::Meter));\n$product->dimensions->fitsInside(Dimensions::of(40, 30, 10, LengthUnit::Centimeter));\n",[89,572,573,590,612,633,650,667,671,684,718,762,766,770,814,858],{"__ignoreMap":134},[138,574,575,577,579,581,583,585,588],{"class":140,"line":141},[138,576,145],{"class":144},[138,578,149],{"class":148},[138,580,153],{"class":152},[138,582,156],{"class":148},[138,584,153],{"class":152},[138,586,587],{"class":148},"Dimensions",[138,589,169],{"class":152},[138,591,592,594,596,598,600,602,605,607,610],{"class":140,"line":172},[138,593,145],{"class":144},[138,595,149],{"class":148},[138,597,153],{"class":152},[138,599,156],{"class":148},[138,601,153],{"class":152},[138,603,604],{"class":148},"Enums",[138,606,153],{"class":152},[138,608,609],{"class":148},"LengthUnit",[138,611,169],{"class":152},[138,613,614,616,618,620,622,624,626,628,631],{"class":140,"line":190},[138,615,145],{"class":144},[138,617,149],{"class":148},[138,619,153],{"class":152},[138,621,156],{"class":148},[138,623,153],{"class":152},[138,625,604],{"class":148},[138,627,153],{"class":152},[138,629,630],{"class":148},"WeightUnit",[138,632,169],{"class":152},[138,634,635,637,639,641,643,645,648],{"class":140,"line":197},[138,636,145],{"class":144},[138,638,149],{"class":148},[138,640,153],{"class":152},[138,642,156],{"class":148},[138,644,153],{"class":152},[138,646,647],{"class":148},"Length",[138,649,169],{"class":152},[138,651,652,654,656,658,660,662,665],{"class":140,"line":223},[138,653,145],{"class":144},[138,655,149],{"class":148},[138,657,153],{"class":152},[138,659,156],{"class":148},[138,661,153],{"class":152},[138,663,664],{"class":148},"Weight",[138,666,169],{"class":152},[138,668,669],{"class":140,"line":250},[138,670,194],{"emptyLinePlaceholder":193},[138,672,673,675,677,679,682],{"class":140,"line":270},[138,674,200],{"class":152},[138,676,382],{"class":148},[138,678,385],{"class":152},[138,680,681],{"class":216},"update",[138,683,220],{"class":152},[138,685,686,688,690,692,694,697,699,701,703,706,708,711,713,716],{"class":140,"line":291},[138,687,226],{"class":152},[138,689,519],{"class":229},[138,691,233],{"class":152},[138,693,236],{"class":152},[138,695,696],{"class":209}," Weight",[138,698,213],{"class":152},[138,700,322],{"class":216},[138,702,325],{"class":152},[138,704,705],{"class":144},"450",[138,707,424],{"class":152},[138,709,710],{"class":209}," WeightUnit",[138,712,213],{"class":152},[138,714,715],{"class":148},"Gram",[138,717,331],{"class":152},[138,719,720,722,724,726,728,731,733,735,737,740,742,745,747,750,752,755,757,760],{"class":140,"line":306},[138,721,226],{"class":152},[138,723,523],{"class":229},[138,725,233],{"class":152},[138,727,236],{"class":152},[138,729,730],{"class":209}," Dimensions",[138,732,213],{"class":152},[138,734,322],{"class":216},[138,736,325],{"class":152},[138,738,739],{"class":144},"30",[138,741,424],{"class":152},[138,743,744],{"class":144}," 20",[138,746,424],{"class":152},[138,748,749],{"class":144}," 2",[138,751,424],{"class":152},[138,753,754],{"class":209}," LengthUnit",[138,756,213],{"class":152},[138,758,759],{"class":148},"Centimeter",[138,761,331],{"class":152},[138,763,764],{"class":140,"line":334},[138,765,361],{"class":152},[138,767,768],{"class":140,"line":358},[138,769,194],{"emptyLinePlaceholder":193},[138,771,772,774,776,778,780,782,785,787,789,791,793,795,797,800,802,804,806,808,811],{"class":140,"line":364},[138,773,200],{"class":152},[138,775,382],{"class":148},[138,777,385],{"class":152},[138,779,519],{"class":148},[138,781,385],{"class":152},[138,783,784],{"class":216},"greaterThan",[138,786,325],{"class":152},[138,788,664],{"class":209},[138,790,213],{"class":152},[138,792,322],{"class":216},[138,794,325],{"class":152},[138,796,233],{"class":152},[138,798,799],{"class":229},"0.4",[138,801,233],{"class":152},[138,803,424],{"class":152},[138,805,710],{"class":209},[138,807,213],{"class":152},[138,809,810],{"class":148},"Kilogram",[138,812,813],{"class":152},"));\n",[138,815,816,818,820,822,824,826,829,832,835,837,839,841,843,845,847,849,851,853,856],{"class":140,"line":369},[138,817,200],{"class":152},[138,819,382],{"class":148},[138,821,385],{"class":152},[138,823,523],{"class":148},[138,825,385],{"class":152},[138,827,828],{"class":216},"longestSide",[138,830,831],{"class":152},"()->",[138,833,834],{"class":216},"lessThan",[138,836,325],{"class":152},[138,838,647],{"class":209},[138,840,213],{"class":152},[138,842,322],{"class":216},[138,844,325],{"class":152},[138,846,506],{"class":144},[138,848,424],{"class":152},[138,850,754],{"class":209},[138,852,213],{"class":152},[138,854,855],{"class":148},"Meter",[138,857,813],{"class":152},[138,859,860,862,864,866,868,870,873,875,877,879,881,883,886,888,891,893,896,898,900,902,904],{"class":140,"line":398},[138,861,200],{"class":152},[138,863,382],{"class":148},[138,865,385],{"class":152},[138,867,523],{"class":148},[138,869,385],{"class":152},[138,871,872],{"class":216},"fitsInside",[138,874,325],{"class":152},[138,876,587],{"class":209},[138,878,213],{"class":152},[138,880,322],{"class":216},[138,882,325],{"class":152},[138,884,885],{"class":144},"40",[138,887,424],{"class":152},[138,889,890],{"class":144}," 30",[138,892,424],{"class":152},[138,894,895],{"class":144}," 10",[138,897,424],{"class":152},[138,899,754],{"class":209},[138,901,213],{"class":152},[138,903,759],{"class":148},[138,905,813],{"class":152},[82,907,908,909,911],{},"Leave either field ",[89,910,478],{}," when the measurement is unknown. Variants inherit\nthe product values until they set their own.",[913,914,916],"h2",{"id":915},"managing-stock","Managing stock",[82,918,919,920,922,923,925,926,928,929,513],{},"Use ",[89,921,474],{}," to store the current inventory count for the product. Leave\n",[89,924,474],{}," as ",[89,927,478],{}," for products that do not have inventory limits.\nProducts allow backorders by default through ",[89,930,488],{},[129,932,934],{"className":131,"code":933,"language":133,"meta":134,"style":134},"$product->stock; \u002F\u002F null\n$product->allow_backorders; \u002F\u002F true\n\n$product->update([\n    'stock' => 10,\n    'min_quantity' => 1,\n    'max_quantity' => 20,\n    'allow_backorders' => false,\n]);\n",[89,935,936,952,966,970,982,996,1011,1025,1038],{"__ignoreMap":134},[138,937,938,940,942,944,946,949],{"class":140,"line":141},[138,939,200],{"class":152},[138,941,382],{"class":148},[138,943,385],{"class":152},[138,945,474],{"class":148},[138,947,948],{"class":152},";",[138,950,951],{"class":452}," \u002F\u002F null\n",[138,953,954,956,958,960,962,964],{"class":140,"line":172},[138,955,200],{"class":152},[138,957,382],{"class":148},[138,959,385],{"class":152},[138,961,488],{"class":148},[138,963,948],{"class":152},[138,965,453],{"class":452},[138,967,968],{"class":140,"line":190},[138,969,194],{"emptyLinePlaceholder":193},[138,971,972,974,976,978,980],{"class":140,"line":197},[138,973,200],{"class":152},[138,975,382],{"class":148},[138,977,385],{"class":152},[138,979,681],{"class":216},[138,981,220],{"class":152},[138,983,984,986,988,990,992,994],{"class":140,"line":223},[138,985,226],{"class":152},[138,987,474],{"class":229},[138,989,233],{"class":152},[138,991,236],{"class":152},[138,993,895],{"class":144},[138,995,247],{"class":152},[138,997,998,1000,1002,1004,1006,1009],{"class":140,"line":250},[138,999,226],{"class":152},[138,1001,496],{"class":229},[138,1003,233],{"class":152},[138,1005,236],{"class":152},[138,1007,1008],{"class":144}," 1",[138,1010,247],{"class":152},[138,1012,1013,1015,1017,1019,1021,1023],{"class":140,"line":270},[138,1014,226],{"class":152},[138,1016,499],{"class":229},[138,1018,233],{"class":152},[138,1020,236],{"class":152},[138,1022,744],{"class":144},[138,1024,247],{"class":152},[138,1026,1027,1029,1031,1033,1035],{"class":140,"line":291},[138,1028,226],{"class":152},[138,1030,488],{"class":229},[138,1032,233],{"class":152},[138,1034,236],{"class":152},[138,1036,1037],{"class":152}," false,\n",[138,1039,1040],{"class":140,"line":306},[138,1041,361],{"class":152},[913,1043,1045],{"id":1044},"getting-visible-products","Getting visible products",[82,1047,919,1048,1051],{},[89,1049,1050],{},"visible()"," when you want to query only products that should be\nshown on storefront pages.",[129,1053,1055],{"className":131,"code":1054,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Models\\Product;\n\n$products = Product::query()->visible()->get();\n",[89,1056,1057,1077,1081],{"__ignoreMap":134},[138,1058,1059,1061,1063,1065,1067,1069,1071,1073,1075],{"class":140,"line":141},[138,1060,145],{"class":144},[138,1062,149],{"class":148},[138,1064,153],{"class":152},[138,1066,156],{"class":148},[138,1068,153],{"class":152},[138,1070,161],{"class":148},[138,1072,153],{"class":152},[138,1074,166],{"class":148},[138,1076,169],{"class":152},[138,1078,1079],{"class":140,"line":172},[138,1080,194],{"emptyLinePlaceholder":193},[138,1082,1083,1085,1088,1090,1092,1094,1097,1099,1102,1104,1107],{"class":140,"line":190},[138,1084,200],{"class":152},[138,1086,1087],{"class":148},"products ",[138,1089,206],{"class":152},[138,1091,210],{"class":209},[138,1093,213],{"class":152},[138,1095,1096],{"class":216},"query",[138,1098,831],{"class":152},[138,1100,1101],{"class":216},"visible",[138,1103,831],{"class":152},[138,1105,1106],{"class":216},"get",[138,1108,395],{"class":152},[82,1110,1111,1112,482,1115,513],{},"The scope filters products where ",[89,1113,1114],{},"status",[89,1116,1117],{},"Visibility::Visible",[913,1119,1121],{"id":1120},"getting-categories-of-a-product","Getting categories of a product",[82,1123,919,1124,1127],{},[89,1125,1126],{},"categories()"," to query the categories attached to the product.",[129,1129,1131],{"className":131,"code":1130,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Models\\Product;\n\n$categories = $product->categories()->get();\n",[89,1132,1133,1153,1157],{"__ignoreMap":134},[138,1134,1135,1137,1139,1141,1143,1145,1147,1149,1151],{"class":140,"line":141},[138,1136,145],{"class":144},[138,1138,149],{"class":148},[138,1140,153],{"class":152},[138,1142,156],{"class":148},[138,1144,153],{"class":152},[138,1146,161],{"class":148},[138,1148,153],{"class":152},[138,1150,166],{"class":148},[138,1152,169],{"class":152},[138,1154,1155],{"class":140,"line":172},[138,1156,194],{"emptyLinePlaceholder":193},[138,1158,1159,1161,1164,1166,1168,1170,1172,1175,1177,1179],{"class":140,"line":190},[138,1160,200],{"class":152},[138,1162,1163],{"class":148},"categories ",[138,1165,206],{"class":152},[138,1167,379],{"class":152},[138,1169,382],{"class":148},[138,1171,385],{"class":152},[138,1173,1174],{"class":216},"categories",[138,1176,831],{"class":152},[138,1178,1106],{"class":216},[138,1180,395],{"class":152},[82,1182,1183],{},"You can eager load categories when fetching products for a listing page.",[129,1185,1187],{"className":131,"code":1186,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Models\\Product;\n\n$products = Product::query()\n    ->visible()\n    ->with('categories')\n    ->get();\n",[89,1188,1189,1209,1213,1230,1239,1257],{"__ignoreMap":134},[138,1190,1191,1193,1195,1197,1199,1201,1203,1205,1207],{"class":140,"line":141},[138,1192,145],{"class":144},[138,1194,149],{"class":148},[138,1196,153],{"class":152},[138,1198,156],{"class":148},[138,1200,153],{"class":152},[138,1202,161],{"class":148},[138,1204,153],{"class":152},[138,1206,166],{"class":148},[138,1208,169],{"class":152},[138,1210,1211],{"class":140,"line":172},[138,1212,194],{"emptyLinePlaceholder":193},[138,1214,1215,1217,1219,1221,1223,1225,1227],{"class":140,"line":190},[138,1216,200],{"class":152},[138,1218,1087],{"class":148},[138,1220,206],{"class":152},[138,1222,210],{"class":209},[138,1224,213],{"class":152},[138,1226,1096],{"class":216},[138,1228,1229],{"class":152},"()\n",[138,1231,1232,1235,1237],{"class":140,"line":197},[138,1233,1234],{"class":152},"    ->",[138,1236,1101],{"class":216},[138,1238,1229],{"class":152},[138,1240,1241,1243,1246,1248,1250,1252,1254],{"class":140,"line":223},[138,1242,1234],{"class":152},[138,1244,1245],{"class":216},"with",[138,1247,325],{"class":152},[138,1249,233],{"class":152},[138,1251,1174],{"class":229},[138,1253,233],{"class":152},[138,1255,1256],{"class":152},")\n",[138,1258,1259,1261,1263],{"class":140,"line":250},[138,1260,1234],{"class":152},[138,1262,1106],{"class":216},[138,1264,395],{"class":152},[913,1266,1268],{"id":1267},"filtering-product-listings","Filtering product listings",[82,1270,1271,1274],{},[89,1272,1273],{},"ProductListingRequest::products()"," applies the current category, sort,\nand product attribute filters from the request query string.",[129,1276,1278],{"className":131,"code":1277,"language":133,"meta":134,"style":134},"$products = $request->products()->get();\n",[89,1279,1280],{"__ignoreMap":134},[138,1281,1282,1284,1286,1288,1290,1293,1295,1298,1300,1302],{"class":140,"line":141},[138,1283,200],{"class":152},[138,1285,1087],{"class":148},[138,1287,206],{"class":152},[138,1289,379],{"class":152},[138,1291,1292],{"class":148},"request",[138,1294,385],{"class":152},[138,1296,1297],{"class":216},"products",[138,1299,831],{"class":152},[138,1301,1106],{"class":216},[138,1303,395],{"class":152},[82,1305,1306,1307,1310],{},"Filter by product attribute slug and attribute value slug with the ",[89,1308,1309],{},"attributes","\nquery parameter.",[129,1312,1317],{"className":1313,"code":1315,"language":1316,"meta":134},[1314],"language-text","\u002Fc\u002Fshirts?attributes[size][]=small&attributes[size][]=medium&attributes[color]=black\n","text",[89,1318,1315],{"__ignoreMap":134},[82,1320,1321],{},"Multiple values for the same attribute match any selected value. Multiple\nattributes must all match.",[913,1323,1325],{"id":1324},"managing-product-images","Managing product images",[82,1327,1328,1329,1332],{},"Product images are stored as reusable image records and attached to\nproducts through a pivot table. The pivot table stores the product\nspecific ",[89,1330,1331],{},"position",", so the same image can be used by multiple products\nwith a different order for each product.",[82,1334,1335,1336,1339],{},"Larasell stores product image paths in the database and resolves URLs\nthrough Laravel's filesystem. Configure the disk in\n",[89,1337,1338],{},"config\u002Flarasell.php"," or with environment variables:",[129,1341,1345],{"className":1342,"code":1343,"language":1344,"meta":134,"style":134},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","LARASELL_IMAGES_DISK=public\nLARASELL_IMAGES_PATH=larasell\u002Fproducts\nLARASELL_IMAGES_VISIBILITY=public\n","env",[89,1346,1347,1352,1357],{"__ignoreMap":134},[138,1348,1349],{"class":140,"line":141},[138,1350,1351],{},"LARASELL_IMAGES_DISK=public\n",[138,1353,1354],{"class":140,"line":172},[138,1355,1356],{},"LARASELL_IMAGES_PATH=larasell\u002Fproducts\n",[138,1358,1359],{"class":140,"line":190},[138,1360,1361],{},"LARASELL_IMAGES_VISIBILITY=public\n",[82,1363,1364],{},"The disk may be any Laravel filesystem disk, including local, S3, or a\ncustom disk registered by the application.",[82,1366,1367],{},"Create an image record with the stored file path, then attach it to the\nproduct with a position.",[129,1369,1371],{"className":131,"code":1370,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Models\\ProductImage;\n\n$image = ProductImage::create([\n    'path' => 'products\u002Fbasic-plan\u002Ffront.jpg',\n    'alt' => 'Basic Plan product image',\n]);\n\n$product->images()->attach($image, [\n    'position' => 0,\n]);\n",[89,1372,1373,1394,1398,1416,1436,1456,1460,1464,1490,1505],{"__ignoreMap":134},[138,1374,1375,1377,1379,1381,1383,1385,1387,1389,1392],{"class":140,"line":141},[138,1376,145],{"class":144},[138,1378,149],{"class":148},[138,1380,153],{"class":152},[138,1382,156],{"class":148},[138,1384,153],{"class":152},[138,1386,161],{"class":148},[138,1388,153],{"class":152},[138,1390,1391],{"class":148},"ProductImage",[138,1393,169],{"class":152},[138,1395,1396],{"class":140,"line":172},[138,1397,194],{"emptyLinePlaceholder":193},[138,1399,1400,1402,1405,1407,1410,1412,1414],{"class":140,"line":190},[138,1401,200],{"class":152},[138,1403,1404],{"class":148},"image ",[138,1406,206],{"class":152},[138,1408,1409],{"class":209}," ProductImage",[138,1411,213],{"class":152},[138,1413,217],{"class":216},[138,1415,220],{"class":152},[138,1417,1418,1420,1423,1425,1427,1429,1432,1434],{"class":140,"line":197},[138,1419,226],{"class":152},[138,1421,1422],{"class":229},"path",[138,1424,233],{"class":152},[138,1426,236],{"class":152},[138,1428,239],{"class":152},[138,1430,1431],{"class":229},"products\u002Fbasic-plan\u002Ffront.jpg",[138,1433,233],{"class":152},[138,1435,247],{"class":152},[138,1437,1438,1440,1443,1445,1447,1449,1452,1454],{"class":140,"line":223},[138,1439,226],{"class":152},[138,1441,1442],{"class":229},"alt",[138,1444,233],{"class":152},[138,1446,236],{"class":152},[138,1448,239],{"class":152},[138,1450,1451],{"class":229},"Basic Plan product image",[138,1453,233],{"class":152},[138,1455,247],{"class":152},[138,1457,1458],{"class":140,"line":250},[138,1459,361],{"class":152},[138,1461,1462],{"class":140,"line":270},[138,1463,194],{"emptyLinePlaceholder":193},[138,1465,1466,1468,1470,1472,1475,1477,1480,1482,1485,1487],{"class":140,"line":291},[138,1467,200],{"class":152},[138,1469,382],{"class":148},[138,1471,385],{"class":152},[138,1473,1474],{"class":216},"images",[138,1476,831],{"class":152},[138,1478,1479],{"class":216},"attach",[138,1481,415],{"class":152},[138,1483,1484],{"class":148},"image",[138,1486,424],{"class":152},[138,1488,1489],{"class":152}," [\n",[138,1491,1492,1494,1496,1498,1500,1503],{"class":140,"line":306},[138,1493,226],{"class":152},[138,1495,1331],{"class":229},[138,1497,233],{"class":152},[138,1499,236],{"class":152},[138,1501,1502],{"class":144}," 0",[138,1504,247],{"class":152},[138,1506,1507],{"class":140,"line":334},[138,1508,361],{"class":152},[82,1510,1511,1512,1515],{},"The ",[89,1513,1514],{},"images()"," relationship includes the pivot position and sorts images\nby that position.",[129,1517,1519],{"className":131,"code":1518,"language":133,"meta":134,"style":134},"$product = Product::query()\n    ->with('images')\n    ->where('slug', 'basic-plan')\n    ->firstOrFail();\n\nforeach ($product->images as $image) {\n    $url = $image->url();\n    $position = $image->pivot->position;\n}\n",[89,1520,1521,1537,1553,1578,1587,1591,1620,1641,1665],{"__ignoreMap":134},[138,1522,1523,1525,1527,1529,1531,1533,1535],{"class":140,"line":141},[138,1524,200],{"class":152},[138,1526,203],{"class":148},[138,1528,206],{"class":152},[138,1530,210],{"class":209},[138,1532,213],{"class":152},[138,1534,1096],{"class":216},[138,1536,1229],{"class":152},[138,1538,1539,1541,1543,1545,1547,1549,1551],{"class":140,"line":172},[138,1540,1234],{"class":152},[138,1542,1245],{"class":216},[138,1544,325],{"class":152},[138,1546,233],{"class":152},[138,1548,1474],{"class":229},[138,1550,233],{"class":152},[138,1552,1256],{"class":152},[138,1554,1555,1557,1560,1562,1564,1566,1568,1570,1572,1574,1576],{"class":140,"line":190},[138,1556,1234],{"class":152},[138,1558,1559],{"class":216},"where",[138,1561,325],{"class":152},[138,1563,233],{"class":152},[138,1565,230],{"class":229},[138,1567,233],{"class":152},[138,1569,424],{"class":152},[138,1571,239],{"class":152},[138,1573,242],{"class":229},[138,1575,233],{"class":152},[138,1577,1256],{"class":152},[138,1579,1580,1582,1585],{"class":140,"line":197},[138,1581,1234],{"class":152},[138,1583,1584],{"class":216},"firstOrFail",[138,1586,395],{"class":152},[138,1588,1589],{"class":140,"line":223},[138,1590,194],{"emptyLinePlaceholder":193},[138,1592,1593,1597,1600,1602,1604,1607,1610,1612,1614,1617],{"class":140,"line":250},[138,1594,1596],{"class":1595},"s7zQu","foreach",[138,1598,1599],{"class":152}," ($",[138,1601,382],{"class":148},[138,1603,385],{"class":152},[138,1605,1606],{"class":148},"images ",[138,1608,1609],{"class":152},"as",[138,1611,379],{"class":152},[138,1613,1484],{"class":148},[138,1615,1616],{"class":152},")",[138,1618,1619],{"class":152}," {\n",[138,1621,1622,1625,1628,1630,1632,1634,1636,1639],{"class":140,"line":270},[138,1623,1624],{"class":152},"    $",[138,1626,1627],{"class":148},"url ",[138,1629,206],{"class":152},[138,1631,379],{"class":152},[138,1633,1484],{"class":148},[138,1635,385],{"class":152},[138,1637,1638],{"class":216},"url",[138,1640,395],{"class":152},[138,1642,1643,1645,1648,1650,1652,1654,1656,1659,1661,1663],{"class":140,"line":291},[138,1644,1624],{"class":152},[138,1646,1647],{"class":148},"position ",[138,1649,206],{"class":152},[138,1651,379],{"class":152},[138,1653,1484],{"class":148},[138,1655,385],{"class":152},[138,1657,1658],{"class":148},"pivot",[138,1660,385],{"class":152},[138,1662,1331],{"class":148},[138,1664,169],{"class":152},[138,1666,1667],{"class":140,"line":306},[138,1668,1669],{"class":152},"}\n",[82,1671,1672],{},"You may update a product's image order by updating the pivot data.",[129,1674,1676],{"className":131,"code":1675,"language":133,"meta":134,"style":134},"$product->images()->updateExistingPivot($image->id, [\n    'position' => 1,\n]);\n",[89,1677,1678,1706,1720],{"__ignoreMap":134},[138,1679,1680,1682,1684,1686,1688,1690,1693,1695,1697,1699,1702,1704],{"class":140,"line":141},[138,1681,200],{"class":152},[138,1683,382],{"class":148},[138,1685,385],{"class":152},[138,1687,1474],{"class":216},[138,1689,831],{"class":152},[138,1691,1692],{"class":216},"updateExistingPivot",[138,1694,415],{"class":152},[138,1696,1484],{"class":148},[138,1698,385],{"class":152},[138,1700,1701],{"class":148},"id",[138,1703,424],{"class":152},[138,1705,1489],{"class":152},[138,1707,1708,1710,1712,1714,1716,1718],{"class":140,"line":172},[138,1709,226],{"class":152},[138,1711,1331],{"class":229},[138,1713,233],{"class":152},[138,1715,236],{"class":152},[138,1717,1008],{"class":144},[138,1719,247],{"class":152},[138,1721,1722],{"class":140,"line":190},[138,1723,361],{"class":152},[82,1725,1726,1727,1730],{},"To replace all image associations and their positions, use ",[89,1728,1729],{},"sync"," with\npivot values.",[129,1732,1734],{"className":131,"code":1733,"language":133,"meta":134,"style":134},"$product->images()->sync([\n    $firstImage->id => ['position' => 0],\n    $secondImage->id => ['position' => 1],\n]);\n",[89,1735,1736,1752,1783,1810],{"__ignoreMap":134},[138,1737,1738,1740,1742,1744,1746,1748,1750],{"class":140,"line":141},[138,1739,200],{"class":152},[138,1741,382],{"class":148},[138,1743,385],{"class":152},[138,1745,1474],{"class":216},[138,1747,831],{"class":152},[138,1749,1729],{"class":216},[138,1751,220],{"class":152},[138,1753,1754,1756,1759,1761,1764,1767,1770,1772,1774,1776,1778,1780],{"class":140,"line":172},[138,1755,1624],{"class":152},[138,1757,1758],{"class":148},"firstImage",[138,1760,385],{"class":152},[138,1762,1763],{"class":148},"id ",[138,1765,1766],{"class":152},"=>",[138,1768,1769],{"class":152}," [",[138,1771,233],{"class":152},[138,1773,1331],{"class":229},[138,1775,233],{"class":152},[138,1777,236],{"class":152},[138,1779,1502],{"class":144},[138,1781,1782],{"class":152},"],\n",[138,1784,1785,1787,1790,1792,1794,1796,1798,1800,1802,1804,1806,1808],{"class":140,"line":190},[138,1786,1624],{"class":152},[138,1788,1789],{"class":148},"secondImage",[138,1791,385],{"class":152},[138,1793,1763],{"class":148},[138,1795,1766],{"class":152},[138,1797,1769],{"class":152},[138,1799,233],{"class":152},[138,1801,1331],{"class":229},[138,1803,233],{"class":152},[138,1805,236],{"class":152},[138,1807,1008],{"class":144},[138,1809,1782],{"class":152},[138,1811,1812],{"class":140,"line":197},[138,1813,361],{"class":152},[913,1815,1817],{"id":1816},"managing-product-attributes","Managing product attributes",[82,1819,1820,1821,528,1824,1827,1828,1831,1832,528,1834,1837,1838,1841],{},"Product attributes are reusable typed definitions, such as ",[89,1822,1823],{},"Size",[89,1825,1826],{},"Color",",\nor ",[89,1829,1830],{},"Gift wrap",". Supported attribute types are ",[89,1833,1316],{},[89,1835,1836],{},"number",", and\n",[89,1839,1840],{},"boolean",". Each attribute owns its available values, and products are\nassigned the specific values they support.",[129,1843,1845],{"className":131,"code":1844,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Enums\\ProductAttributeType;\nuse Larasell\\Larasell\\Models\\ProductAttribute;\n\n$size = ProductAttribute::create([\n    'slug' => 'size',\n    'name' => 'Size',\n    'type' => ProductAttributeType::Text,\n]);\n\n$small = $size->values()->create([\n    'slug' => 'small',\n    'name' => 'Small',\n    'value' => 'small',\n    'position' => 0,\n]);\n\n$product->attributeValues()->attach($small);\n",[89,1846,1847,1868,1889,1893,1911,1930,1948,1969,1973,1977,2001,2020,2039,2058,2072,2076,2081],{"__ignoreMap":134},[138,1848,1849,1851,1853,1855,1857,1859,1861,1863,1866],{"class":140,"line":141},[138,1850,145],{"class":144},[138,1852,149],{"class":148},[138,1854,153],{"class":152},[138,1856,156],{"class":148},[138,1858,153],{"class":152},[138,1860,604],{"class":148},[138,1862,153],{"class":152},[138,1864,1865],{"class":148},"ProductAttributeType",[138,1867,169],{"class":152},[138,1869,1870,1872,1874,1876,1878,1880,1882,1884,1887],{"class":140,"line":172},[138,1871,145],{"class":144},[138,1873,149],{"class":148},[138,1875,153],{"class":152},[138,1877,156],{"class":148},[138,1879,153],{"class":152},[138,1881,161],{"class":148},[138,1883,153],{"class":152},[138,1885,1886],{"class":148},"ProductAttribute",[138,1888,169],{"class":152},[138,1890,1891],{"class":140,"line":190},[138,1892,194],{"emptyLinePlaceholder":193},[138,1894,1895,1897,1900,1902,1905,1907,1909],{"class":140,"line":197},[138,1896,200],{"class":152},[138,1898,1899],{"class":148},"size ",[138,1901,206],{"class":152},[138,1903,1904],{"class":209}," ProductAttribute",[138,1906,213],{"class":152},[138,1908,217],{"class":216},[138,1910,220],{"class":152},[138,1912,1913,1915,1917,1919,1921,1923,1926,1928],{"class":140,"line":223},[138,1914,226],{"class":152},[138,1916,230],{"class":229},[138,1918,233],{"class":152},[138,1920,236],{"class":152},[138,1922,239],{"class":152},[138,1924,1925],{"class":229},"size",[138,1927,233],{"class":152},[138,1929,247],{"class":152},[138,1931,1932,1934,1936,1938,1940,1942,1944,1946],{"class":140,"line":250},[138,1933,226],{"class":152},[138,1935,95],{"class":229},[138,1937,233],{"class":152},[138,1939,236],{"class":152},[138,1941,239],{"class":152},[138,1943,1823],{"class":229},[138,1945,233],{"class":152},[138,1947,247],{"class":152},[138,1949,1950,1952,1955,1957,1959,1962,1964,1967],{"class":140,"line":270},[138,1951,226],{"class":152},[138,1953,1954],{"class":229},"type",[138,1956,233],{"class":152},[138,1958,236],{"class":152},[138,1960,1961],{"class":209}," ProductAttributeType",[138,1963,213],{"class":152},[138,1965,1966],{"class":148},"Text",[138,1968,247],{"class":152},[138,1970,1971],{"class":140,"line":291},[138,1972,361],{"class":152},[138,1974,1975],{"class":140,"line":306},[138,1976,194],{"emptyLinePlaceholder":193},[138,1978,1979,1981,1984,1986,1988,1990,1992,1995,1997,1999],{"class":140,"line":334},[138,1980,200],{"class":152},[138,1982,1983],{"class":148},"small ",[138,1985,206],{"class":152},[138,1987,379],{"class":152},[138,1989,1925],{"class":148},[138,1991,385],{"class":152},[138,1993,1994],{"class":216},"values",[138,1996,831],{"class":152},[138,1998,217],{"class":216},[138,2000,220],{"class":152},[138,2002,2003,2005,2007,2009,2011,2013,2016,2018],{"class":140,"line":358},[138,2004,226],{"class":152},[138,2006,230],{"class":229},[138,2008,233],{"class":152},[138,2010,236],{"class":152},[138,2012,239],{"class":152},[138,2014,2015],{"class":229},"small",[138,2017,233],{"class":152},[138,2019,247],{"class":152},[138,2021,2022,2024,2026,2028,2030,2032,2035,2037],{"class":140,"line":364},[138,2023,226],{"class":152},[138,2025,95],{"class":229},[138,2027,233],{"class":152},[138,2029,236],{"class":152},[138,2031,239],{"class":152},[138,2033,2034],{"class":229},"Small",[138,2036,233],{"class":152},[138,2038,247],{"class":152},[138,2040,2041,2043,2046,2048,2050,2052,2054,2056],{"class":140,"line":369},[138,2042,226],{"class":152},[138,2044,2045],{"class":229},"value",[138,2047,233],{"class":152},[138,2049,236],{"class":152},[138,2051,239],{"class":152},[138,2053,2015],{"class":229},[138,2055,233],{"class":152},[138,2057,247],{"class":152},[138,2059,2060,2062,2064,2066,2068,2070],{"class":140,"line":398},[138,2061,226],{"class":152},[138,2063,1331],{"class":229},[138,2065,233],{"class":152},[138,2067,236],{"class":152},[138,2069,1502],{"class":144},[138,2071,247],{"class":152},[138,2073,2074],{"class":140,"line":437},[138,2075,361],{"class":152},[138,2077,2079],{"class":140,"line":2078},16,[138,2080,194],{"emptyLinePlaceholder":193},[138,2082,2084,2086,2088,2090,2093,2095,2097,2099,2101],{"class":140,"line":2083},17,[138,2085,200],{"class":152},[138,2087,382],{"class":148},[138,2089,385],{"class":152},[138,2091,2092],{"class":216},"attributeValues",[138,2094,831],{"class":152},[138,2096,1479],{"class":216},[138,2098,415],{"class":152},[138,2100,2015],{"class":148},[138,2102,434],{"class":152},[82,2104,2105],{},"Choose which attached attributes define purchasable variants. Generation must\nproduce at least two combinations.",[129,2107,2109],{"className":131,"code":2108,"language":133,"meta":134,"style":134},"$medium = $size->values()->create([\n    'slug' => 'medium',\n    'name' => 'Medium',\n    'value' => 'medium',\n]);\n$product->attributeValues()->attach($medium);\n\n$variants = $product->generateVariants([$size]);\n",[89,2110,2111,2134,2153,2172,2190,2194,2214,2218],{"__ignoreMap":134},[138,2112,2113,2115,2118,2120,2122,2124,2126,2128,2130,2132],{"class":140,"line":141},[138,2114,200],{"class":152},[138,2116,2117],{"class":148},"medium ",[138,2119,206],{"class":152},[138,2121,379],{"class":152},[138,2123,1925],{"class":148},[138,2125,385],{"class":152},[138,2127,1994],{"class":216},[138,2129,831],{"class":152},[138,2131,217],{"class":216},[138,2133,220],{"class":152},[138,2135,2136,2138,2140,2142,2144,2146,2149,2151],{"class":140,"line":172},[138,2137,226],{"class":152},[138,2139,230],{"class":229},[138,2141,233],{"class":152},[138,2143,236],{"class":152},[138,2145,239],{"class":152},[138,2147,2148],{"class":229},"medium",[138,2150,233],{"class":152},[138,2152,247],{"class":152},[138,2154,2155,2157,2159,2161,2163,2165,2168,2170],{"class":140,"line":190},[138,2156,226],{"class":152},[138,2158,95],{"class":229},[138,2160,233],{"class":152},[138,2162,236],{"class":152},[138,2164,239],{"class":152},[138,2166,2167],{"class":229},"Medium",[138,2169,233],{"class":152},[138,2171,247],{"class":152},[138,2173,2174,2176,2178,2180,2182,2184,2186,2188],{"class":140,"line":197},[138,2175,226],{"class":152},[138,2177,2045],{"class":229},[138,2179,233],{"class":152},[138,2181,236],{"class":152},[138,2183,239],{"class":152},[138,2185,2148],{"class":229},[138,2187,233],{"class":152},[138,2189,247],{"class":152},[138,2191,2192],{"class":140,"line":223},[138,2193,361],{"class":152},[138,2195,2196,2198,2200,2202,2204,2206,2208,2210,2212],{"class":140,"line":250},[138,2197,200],{"class":152},[138,2199,382],{"class":148},[138,2201,385],{"class":152},[138,2203,2092],{"class":216},[138,2205,831],{"class":152},[138,2207,1479],{"class":216},[138,2209,415],{"class":152},[138,2211,2148],{"class":148},[138,2213,434],{"class":152},[138,2215,2216],{"class":140,"line":270},[138,2217,194],{"emptyLinePlaceholder":193},[138,2219,2220,2222,2225,2227,2229,2231,2233,2236,2239,2241],{"class":140,"line":291},[138,2221,200],{"class":152},[138,2223,2224],{"class":148},"variants ",[138,2226,206],{"class":152},[138,2228,379],{"class":152},[138,2230,382],{"class":148},[138,2232,385],{"class":152},[138,2234,2235],{"class":216},"generateVariants",[138,2237,2238],{"class":152},"([$",[138,2240,1925],{"class":148},[138,2242,361],{"class":152},[82,2244,2245,2246,2249],{},"The selected attributes are persisted in ",[89,2247,2248],{},"variantDimensions()",". Calling the\ngenerator again creates only missing combinations and preserves existing\nvariant data. Generated variants start hidden so the merchant can review SKU,\nprice, inventory, and availability before selling them.",[82,2251,2252],{},"Resolve a storefront selection using stable attribute and value slugs:",[129,2254,2256],{"className":131,"code":2255,"language":133,"meta":134,"style":134},"$variant = $product->variantFor([\n    'size' => 'small',\n    'color' => 'black',\n]);\n\n$cart->add($variant, quantity: 2);\n",[89,2257,2258,2278,2296,2316,2320,2324],{"__ignoreMap":134},[138,2259,2260,2262,2265,2267,2269,2271,2273,2276],{"class":140,"line":141},[138,2261,200],{"class":152},[138,2263,2264],{"class":148},"variant ",[138,2266,206],{"class":152},[138,2268,379],{"class":152},[138,2270,382],{"class":148},[138,2272,385],{"class":152},[138,2274,2275],{"class":216},"variantFor",[138,2277,220],{"class":152},[138,2279,2280,2282,2284,2286,2288,2290,2292,2294],{"class":140,"line":172},[138,2281,226],{"class":152},[138,2283,1925],{"class":229},[138,2285,233],{"class":152},[138,2287,236],{"class":152},[138,2289,239],{"class":152},[138,2291,2015],{"class":229},[138,2293,233],{"class":152},[138,2295,247],{"class":152},[138,2297,2298,2300,2303,2305,2307,2309,2312,2314],{"class":140,"line":190},[138,2299,226],{"class":152},[138,2301,2302],{"class":229},"color",[138,2304,233],{"class":152},[138,2306,236],{"class":152},[138,2308,239],{"class":152},[138,2310,2311],{"class":229},"black",[138,2313,233],{"class":152},[138,2315,247],{"class":152},[138,2317,2318],{"class":140,"line":197},[138,2319,361],{"class":152},[138,2321,2322],{"class":140,"line":223},[138,2323,194],{"emptyLinePlaceholder":193},[138,2325,2326,2328,2331,2333,2336,2338,2341,2343,2346,2349,2351],{"class":140,"line":250},[138,2327,200],{"class":152},[138,2329,2330],{"class":148},"cart",[138,2332,385],{"class":152},[138,2334,2335],{"class":216},"add",[138,2337,415],{"class":152},[138,2339,2340],{"class":148},"variant",[138,2342,424],{"class":152},[138,2344,2345],{"class":209}," quantity",[138,2347,2348],{"class":152},":",[138,2350,749],{"class":144},[138,2352,434],{"class":152},[82,2354,2355,2358,2359,459,2362,2365,2366,459,2369,2372,2373,2376],{},[89,2356,2357],{},"ProductVariant"," is the authoritative purchasable record. Its nullable price,\ncompare-at price, weight, dimensions, stock, backorder policy, and quantity\nlimits inherit from the product. SKU and barcode also inherit when omitted.\nUse ",[89,2360,2361],{},"compareAtPrice()",[89,2363,2364],{},"onSale()"," for the effective compare-at amount, and\n",[89,2367,2368],{},"effectiveWeight()",[89,2370,2371],{},"effectiveDimensions()"," for shipping measurements.\nProducts without generated combinations use an automatically-created default\nvariant, so ",[89,2374,2375],{},"$cart->add($product)"," remains valid.",[82,2378,2379],{},"Variant combinations are identified by stable attribute and value IDs rather\nthan customer-facing labels. Duplicate combinations, SKUs, and barcodes are\nrejected.",[82,2381,2382],{},"Attribute values must match their parent attribute type. Text attributes accept\nstrings, number attributes accept integers or floats, and boolean attributes\naccept booleans.",[129,2384,2386],{"className":131,"code":2385,"language":133,"meta":134,"style":134},"$giftWrap = ProductAttribute::create([\n    'slug' => 'gift-wrap',\n    'name' => 'Gift wrap',\n    'type' => ProductAttributeType::Boolean,\n]);\n\n$giftWrap->values()->create([\n    'slug' => 'yes',\n    'name' => 'Yes',\n    'value' => true,\n]);\n",[89,2387,2388,2405,2424,2442,2461,2465,2469,2486,2505,2524,2537],{"__ignoreMap":134},[138,2389,2390,2392,2395,2397,2399,2401,2403],{"class":140,"line":141},[138,2391,200],{"class":152},[138,2393,2394],{"class":148},"giftWrap ",[138,2396,206],{"class":152},[138,2398,1904],{"class":209},[138,2400,213],{"class":152},[138,2402,217],{"class":216},[138,2404,220],{"class":152},[138,2406,2407,2409,2411,2413,2415,2417,2420,2422],{"class":140,"line":172},[138,2408,226],{"class":152},[138,2410,230],{"class":229},[138,2412,233],{"class":152},[138,2414,236],{"class":152},[138,2416,239],{"class":152},[138,2418,2419],{"class":229},"gift-wrap",[138,2421,233],{"class":152},[138,2423,247],{"class":152},[138,2425,2426,2428,2430,2432,2434,2436,2438,2440],{"class":140,"line":190},[138,2427,226],{"class":152},[138,2429,95],{"class":229},[138,2431,233],{"class":152},[138,2433,236],{"class":152},[138,2435,239],{"class":152},[138,2437,1830],{"class":229},[138,2439,233],{"class":152},[138,2441,247],{"class":152},[138,2443,2444,2446,2448,2450,2452,2454,2456,2459],{"class":140,"line":197},[138,2445,226],{"class":152},[138,2447,1954],{"class":229},[138,2449,233],{"class":152},[138,2451,236],{"class":152},[138,2453,1961],{"class":209},[138,2455,213],{"class":152},[138,2457,2458],{"class":148},"Boolean",[138,2460,247],{"class":152},[138,2462,2463],{"class":140,"line":223},[138,2464,361],{"class":152},[138,2466,2467],{"class":140,"line":250},[138,2468,194],{"emptyLinePlaceholder":193},[138,2470,2471,2473,2476,2478,2480,2482,2484],{"class":140,"line":270},[138,2472,200],{"class":152},[138,2474,2475],{"class":148},"giftWrap",[138,2477,385],{"class":152},[138,2479,1994],{"class":216},[138,2481,831],{"class":152},[138,2483,217],{"class":216},[138,2485,220],{"class":152},[138,2487,2488,2490,2492,2494,2496,2498,2501,2503],{"class":140,"line":291},[138,2489,226],{"class":152},[138,2491,230],{"class":229},[138,2493,233],{"class":152},[138,2495,236],{"class":152},[138,2497,239],{"class":152},[138,2499,2500],{"class":229},"yes",[138,2502,233],{"class":152},[138,2504,247],{"class":152},[138,2506,2507,2509,2511,2513,2515,2517,2520,2522],{"class":140,"line":306},[138,2508,226],{"class":152},[138,2510,95],{"class":229},[138,2512,233],{"class":152},[138,2514,236],{"class":152},[138,2516,239],{"class":152},[138,2518,2519],{"class":229},"Yes",[138,2521,233],{"class":152},[138,2523,247],{"class":152},[138,2525,2526,2528,2530,2532,2534],{"class":140,"line":334},[138,2527,226],{"class":152},[138,2529,2045],{"class":229},[138,2531,233],{"class":152},[138,2533,236],{"class":152},[138,2535,2536],{"class":152}," true,\n",[138,2538,2539],{"class":140,"line":358},[138,2540,361],{"class":152},[82,2542,919,2543,2546],{},[89,2544,2545],{},"withAttributeValues()"," to load product attribute values with their parent\nattribute when rendering a product page.",[129,2548,2550],{"className":131,"code":2549,"language":133,"meta":134,"style":134},"$product = Product::query()\n    ->withAttributeValues()\n    ->where('slug', 'basic-plan')\n    ->firstOrFail();\n\nforeach ($product->attributeValues as $value) {\n    $attributeName = $value->attribute->name;\n    $valueName = $value->name;\n}\n",[89,2551,2552,2568,2577,2601,2609,2613,2636,2660,2679],{"__ignoreMap":134},[138,2553,2554,2556,2558,2560,2562,2564,2566],{"class":140,"line":141},[138,2555,200],{"class":152},[138,2557,203],{"class":148},[138,2559,206],{"class":152},[138,2561,210],{"class":209},[138,2563,213],{"class":152},[138,2565,1096],{"class":216},[138,2567,1229],{"class":152},[138,2569,2570,2572,2575],{"class":140,"line":172},[138,2571,1234],{"class":152},[138,2573,2574],{"class":216},"withAttributeValues",[138,2576,1229],{"class":152},[138,2578,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599],{"class":140,"line":190},[138,2580,1234],{"class":152},[138,2582,1559],{"class":216},[138,2584,325],{"class":152},[138,2586,233],{"class":152},[138,2588,230],{"class":229},[138,2590,233],{"class":152},[138,2592,424],{"class":152},[138,2594,239],{"class":152},[138,2596,242],{"class":229},[138,2598,233],{"class":152},[138,2600,1256],{"class":152},[138,2602,2603,2605,2607],{"class":140,"line":197},[138,2604,1234],{"class":152},[138,2606,1584],{"class":216},[138,2608,395],{"class":152},[138,2610,2611],{"class":140,"line":223},[138,2612,194],{"emptyLinePlaceholder":193},[138,2614,2615,2617,2619,2621,2623,2626,2628,2630,2632,2634],{"class":140,"line":250},[138,2616,1596],{"class":1595},[138,2618,1599],{"class":152},[138,2620,382],{"class":148},[138,2622,385],{"class":152},[138,2624,2625],{"class":148},"attributeValues ",[138,2627,1609],{"class":152},[138,2629,379],{"class":152},[138,2631,2045],{"class":148},[138,2633,1616],{"class":152},[138,2635,1619],{"class":152},[138,2637,2638,2640,2643,2645,2647,2649,2651,2654,2656,2658],{"class":140,"line":270},[138,2639,1624],{"class":152},[138,2641,2642],{"class":148},"attributeName ",[138,2644,206],{"class":152},[138,2646,379],{"class":152},[138,2648,2045],{"class":148},[138,2650,385],{"class":152},[138,2652,2653],{"class":148},"attribute",[138,2655,385],{"class":152},[138,2657,95],{"class":148},[138,2659,169],{"class":152},[138,2661,2662,2664,2667,2669,2671,2673,2675,2677],{"class":140,"line":291},[138,2663,1624],{"class":152},[138,2665,2666],{"class":148},"valueName ",[138,2668,206],{"class":152},[138,2670,379],{"class":152},[138,2672,2045],{"class":148},[138,2674,385],{"class":152},[138,2676,95],{"class":148},[138,2678,169],{"class":152},[138,2680,2681],{"class":140,"line":306},[138,2682,1669],{"class":152},[913,2684,2686],{"id":2685},"getting-a-visible-product-by-slug","Getting a visible product by slug",[82,2688,2689,2690,2692],{},"For product detail pages, combine the slug with the ",[89,2691,1050],{}," scope so\ninactive products are not shown.",[129,2694,2696],{"className":131,"code":2695,"language":133,"meta":134,"style":134},"use Larasell\\Larasell\\Models\\Product;\n\n$product = Product::query()\n    ->visible()\n    ->where('slug', $slug)\n    ->firstOrFail();\n",[89,2697,2698,2718,2722,2738,2746,2768],{"__ignoreMap":134},[138,2699,2700,2702,2704,2706,2708,2710,2712,2714,2716],{"class":140,"line":141},[138,2701,145],{"class":144},[138,2703,149],{"class":148},[138,2705,153],{"class":152},[138,2707,156],{"class":148},[138,2709,153],{"class":152},[138,2711,161],{"class":148},[138,2713,153],{"class":152},[138,2715,166],{"class":148},[138,2717,169],{"class":152},[138,2719,2720],{"class":140,"line":172},[138,2721,194],{"emptyLinePlaceholder":193},[138,2723,2724,2726,2728,2730,2732,2734,2736],{"class":140,"line":190},[138,2725,200],{"class":152},[138,2727,203],{"class":148},[138,2729,206],{"class":152},[138,2731,210],{"class":209},[138,2733,213],{"class":152},[138,2735,1096],{"class":216},[138,2737,1229],{"class":152},[138,2739,2740,2742,2744],{"class":140,"line":197},[138,2741,1234],{"class":152},[138,2743,1101],{"class":216},[138,2745,1229],{"class":152},[138,2747,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766],{"class":140,"line":223},[138,2749,1234],{"class":152},[138,2751,1559],{"class":216},[138,2753,325],{"class":152},[138,2755,233],{"class":152},[138,2757,230],{"class":229},[138,2759,233],{"class":152},[138,2761,424],{"class":152},[138,2763,379],{"class":152},[138,2765,230],{"class":148},[138,2767,1256],{"class":152},[138,2769,2770,2772,2774],{"class":140,"line":250},[138,2771,1234],{"class":152},[138,2773,1584],{"class":216},[138,2775,395],{"class":152},[82,2777,2778,2779,513],{},"Resolve the product description for the current locale with ",[89,2780,2781],{},"get()",[129,2783,2785],{"className":131,"code":2784,"language":133,"meta":134,"style":134},"$description = $product->description?->get();\n",[89,2786,2787],{"__ignoreMap":134},[138,2788,2789,2791,2794,2796,2798,2800,2802,2804,2807,2809],{"class":140,"line":141},[138,2790,200],{"class":152},[138,2792,2793],{"class":148},"description ",[138,2795,206],{"class":152},[138,2797,379],{"class":152},[138,2799,382],{"class":148},[138,2801,385],{"class":152},[138,2803,91],{"class":148},[138,2805,2806],{"class":152},"?->",[138,2808,1106],{"class":216},[138,2810,395],{"class":152},[2812,2813,2814],"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 .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 .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .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 .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}",{"title":134,"searchDepth":141,"depth":172,"links":2816},[2817,2818,2819,2820,2821,2822,2823],{"id":915,"depth":172,"text":916},{"id":1044,"depth":172,"text":1045},{"id":1120,"depth":172,"text":1121},{"id":1267,"depth":172,"text":1268},{"id":1324,"depth":172,"text":1325},{"id":1816,"depth":172,"text":1817},{"id":2685,"depth":172,"text":2686},"Fetch visible products and their attached categories.","md",null,{},{"title":30,"description":2824},"rZuwgQ7R44-cVtwho8s8BFHudNcKxz6jWJHWH6_BBNA",[2831,2833],{"title":26,"path":27,"stem":28,"description":2832,"children":-1},"Generate customizable, concurrency-safe order numbers.",{"title":34,"path":35,"stem":36,"description":2834,"children":-1},"Define automatic and code-based promotions, allocate discounts, and read discount totals.",1789114878354]