[{"data":1,"prerenderedAt":3416},["ShallowReactive",2],{"post-typeorm-entity-basics":3},{"id":4,"title":5,"body":6,"date":3405,"description":3406,"extension":3407,"meta":3408,"navigation":84,"path":3412,"seo":3413,"stem":3414,"__hash__":3415},"blog\u002Fblog\u002Ftypeorm-entity-basics.md","TypeORMでEntityを定義する - 基礎から実践まで",{"type":7,"value":8,"toc":3368},"minimark",[9,14,18,24,40,44,49,202,205,295,298,301,620,624,797,800,958,961,965,1210,1214,1494,1498,1761,1764,1768,1771,1942,1946,2187,2191,2321,2324,2328,2331,2435,2440,2448,2451,2454,2640,2644,2647,2888,2892,3076,3079,3083,3090,3163,3167,3170,3207,3211,3214,3244,3248,3255,3288,3291,3294,3333,3336,3339,3364],[10,11,13],"h2",{"id":12},"typeormのentityとは","TypeORMのEntityとは",[15,16,17],"p",{},"TypeORMのEntityは、データベーステーブルとTypeScriptクラスをマッピングするためのクラスです。",[15,19,20],{},[21,22,23],"strong",{},"Entityの役割",[25,26,27,31,34,37],"ul",{},[28,29,30],"li",{},"データベーステーブルの構造を定義",[28,32,33],{},"カラムの型や制約を指定",[28,35,36],{},"テーブル間のリレーションを表現",[28,38,39],{},"オブジェクト指向のデータ操作を実現",[10,41,43],{"id":42},"基本的なentity定義","基本的なEntity定義",[45,46,48],"h3",{"id":47},"最小構成のentity","最小構成のEntity",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-typescript shiki shiki-themes github-light github-dark","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'\n\n@Entity('users')\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  name: string\n\n  @Column()\n  email: string\n}\n","typescript","",[57,58,59,79,86,105,120,132,146,151,161,172,177,186,196],"code",{"__ignoreMap":55},[60,61,64,68,72,75],"span",{"class":62,"line":63},"line",1,[60,65,67],{"class":66},"szBVR","import",[60,69,71],{"class":70},"sVt8B"," { Entity, PrimaryGeneratedColumn, Column } ",[60,73,74],{"class":66},"from",[60,76,78],{"class":77},"sZZnC"," 'typeorm'\n",[60,80,82],{"class":62,"line":81},2,[60,83,85],{"emptyLinePlaceholder":84},true,"\n",[60,87,89,92,96,99,102],{"class":62,"line":88},3,[60,90,91],{"class":70},"@",[60,93,95],{"class":94},"sScJk","Entity",[60,97,98],{"class":70},"(",[60,100,101],{"class":77},"'users'",[60,103,104],{"class":70},")\n",[60,106,108,111,114,117],{"class":62,"line":107},4,[60,109,110],{"class":66},"export",[60,112,113],{"class":66}," class",[60,115,116],{"class":94}," User",[60,118,119],{"class":70}," {\n",[60,121,123,126,129],{"class":62,"line":122},5,[60,124,125],{"class":70},"  @",[60,127,128],{"class":94},"PrimaryGeneratedColumn",[60,130,131],{"class":70},"()\n",[60,133,135,139,142],{"class":62,"line":134},6,[60,136,138],{"class":137},"s4XuR","  id",[60,140,141],{"class":66},":",[60,143,145],{"class":144},"sj4cs"," number\n",[60,147,149],{"class":62,"line":148},7,[60,150,85],{"emptyLinePlaceholder":84},[60,152,154,156,159],{"class":62,"line":153},8,[60,155,125],{"class":70},[60,157,158],{"class":94},"Column",[60,160,131],{"class":70},[60,162,164,167,169],{"class":62,"line":163},9,[60,165,166],{"class":137},"  name",[60,168,141],{"class":66},[60,170,171],{"class":144}," string\n",[60,173,175],{"class":62,"line":174},10,[60,176,85],{"emptyLinePlaceholder":84},[60,178,180,182,184],{"class":62,"line":179},11,[60,181,125],{"class":70},[60,183,158],{"class":94},[60,185,131],{"class":70},[60,187,189,192,194],{"class":62,"line":188},12,[60,190,191],{"class":137},"  email",[60,193,141],{"class":66},[60,195,171],{"class":144},[60,197,199],{"class":62,"line":198},13,[60,200,201],{"class":70},"}\n",[45,203,204],{"id":204},"主要なデコレータ",[206,207,208,221],"table",{},[209,210,211],"thead",{},[212,213,214,218],"tr",{},[215,216,217],"th",{},"デコレータ",[215,219,220],{},"説明",[222,223,224,235,245,255,265,275,285],"tbody",{},[212,225,226,232],{},[227,228,229],"td",{},[57,230,231],{},"@Entity()",[227,233,234],{},"クラスがEntityであることを宣言",[212,236,237,242],{},[227,238,239],{},[57,240,241],{},"@PrimaryGeneratedColumn()",[227,243,244],{},"自動採番の主キー",[212,246,247,252],{},[227,248,249],{},[57,250,251],{},"@PrimaryColumn()",[227,253,254],{},"手動設定の主キー",[212,256,257,262],{},[227,258,259],{},[57,260,261],{},"@Column()",[227,263,264],{},"通常のカラム",[212,266,267,272],{},[227,268,269],{},[57,270,271],{},"@CreateDateColumn()",[227,273,274],{},"作成日時（自動設定）",[212,276,277,282],{},[227,278,279],{},[57,280,281],{},"@UpdateDateColumn()",[227,283,284],{},"更新日時（自動更新）",[212,286,287,292],{},[227,288,289],{},[57,290,291],{},"@DeleteDateColumn()",[227,293,294],{},"削除日時（ソフトデリート用）",[10,296,297],{"id":297},"カラム定義の詳細",[45,299,300],{"id":300},"カラムの型指定",[50,302,304],{"className":52,"code":303,"language":54,"meta":55,"style":55},"@Entity()\nexport class Product {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  \u002F\u002F 文字列型\n  @Column('varchar', { length: 255 })\n  name: string\n\n  \u002F\u002F 数値型（整数）\n  @Column('int', { unsigned: true })\n  price: number\n\n  \u002F\u002F 数値型（小数）\n  @Column('decimal', { precision: 10, scale: 2 })\n  weight: number\n\n  \u002F\u002F 真偽値\n  @Column('boolean', { default: true })\n  isActive: boolean\n\n  \u002F\u002F テキスト\n  @Column('text')\n  description: string\n\n  \u002F\u002F 日付\n  @Column('date')\n  publishedAt: Date\n\n  \u002F\u002F JSON\n  @Column('json', { nullable: true })\n  metadata: object\n}\n",[57,305,306,314,325,333,341,345,351,371,379,383,388,407,416,420,426,452,462,467,473,492,503,508,514,528,538,543,549,563,574,579,585,604,615],{"__ignoreMap":55},[60,307,308,310,312],{"class":62,"line":63},[60,309,91],{"class":70},[60,311,95],{"class":94},[60,313,131],{"class":70},[60,315,316,318,320,323],{"class":62,"line":81},[60,317,110],{"class":66},[60,319,113],{"class":66},[60,321,322],{"class":94}," Product",[60,324,119],{"class":70},[60,326,327,329,331],{"class":62,"line":88},[60,328,125],{"class":70},[60,330,128],{"class":94},[60,332,131],{"class":70},[60,334,335,337,339],{"class":62,"line":107},[60,336,138],{"class":137},[60,338,141],{"class":66},[60,340,145],{"class":144},[60,342,343],{"class":62,"line":122},[60,344,85],{"emptyLinePlaceholder":84},[60,346,347],{"class":62,"line":134},[60,348,350],{"class":349},"sJ8bj","  \u002F\u002F 文字列型\n",[60,352,353,355,357,359,362,365,368],{"class":62,"line":148},[60,354,125],{"class":70},[60,356,158],{"class":94},[60,358,98],{"class":70},[60,360,361],{"class":77},"'varchar'",[60,363,364],{"class":70},", { length: ",[60,366,367],{"class":144},"255",[60,369,370],{"class":70}," })\n",[60,372,373,375,377],{"class":62,"line":153},[60,374,166],{"class":137},[60,376,141],{"class":66},[60,378,171],{"class":144},[60,380,381],{"class":62,"line":163},[60,382,85],{"emptyLinePlaceholder":84},[60,384,385],{"class":62,"line":174},[60,386,387],{"class":349},"  \u002F\u002F 数値型（整数）\n",[60,389,390,392,394,396,399,402,405],{"class":62,"line":179},[60,391,125],{"class":70},[60,393,158],{"class":94},[60,395,98],{"class":70},[60,397,398],{"class":77},"'int'",[60,400,401],{"class":70},", { unsigned: ",[60,403,404],{"class":144},"true",[60,406,370],{"class":70},[60,408,409,412,414],{"class":62,"line":188},[60,410,411],{"class":137},"  price",[60,413,141],{"class":66},[60,415,145],{"class":144},[60,417,418],{"class":62,"line":198},[60,419,85],{"emptyLinePlaceholder":84},[60,421,423],{"class":62,"line":422},14,[60,424,425],{"class":349},"  \u002F\u002F 数値型（小数）\n",[60,427,429,431,433,435,438,441,444,447,450],{"class":62,"line":428},15,[60,430,125],{"class":70},[60,432,158],{"class":94},[60,434,98],{"class":70},[60,436,437],{"class":77},"'decimal'",[60,439,440],{"class":70},", { precision: ",[60,442,443],{"class":144},"10",[60,445,446],{"class":70},", scale: ",[60,448,449],{"class":144},"2",[60,451,370],{"class":70},[60,453,455,458,460],{"class":62,"line":454},16,[60,456,457],{"class":137},"  weight",[60,459,141],{"class":66},[60,461,145],{"class":144},[60,463,465],{"class":62,"line":464},17,[60,466,85],{"emptyLinePlaceholder":84},[60,468,470],{"class":62,"line":469},18,[60,471,472],{"class":349},"  \u002F\u002F 真偽値\n",[60,474,476,478,480,482,485,488,490],{"class":62,"line":475},19,[60,477,125],{"class":70},[60,479,158],{"class":94},[60,481,98],{"class":70},[60,483,484],{"class":77},"'boolean'",[60,486,487],{"class":70},", { default: ",[60,489,404],{"class":144},[60,491,370],{"class":70},[60,493,495,498,500],{"class":62,"line":494},20,[60,496,497],{"class":137},"  isActive",[60,499,141],{"class":66},[60,501,502],{"class":144}," boolean\n",[60,504,506],{"class":62,"line":505},21,[60,507,85],{"emptyLinePlaceholder":84},[60,509,511],{"class":62,"line":510},22,[60,512,513],{"class":349},"  \u002F\u002F テキスト\n",[60,515,517,519,521,523,526],{"class":62,"line":516},23,[60,518,125],{"class":70},[60,520,158],{"class":94},[60,522,98],{"class":70},[60,524,525],{"class":77},"'text'",[60,527,104],{"class":70},[60,529,531,534,536],{"class":62,"line":530},24,[60,532,533],{"class":137},"  description",[60,535,141],{"class":66},[60,537,171],{"class":144},[60,539,541],{"class":62,"line":540},25,[60,542,85],{"emptyLinePlaceholder":84},[60,544,546],{"class":62,"line":545},26,[60,547,548],{"class":349},"  \u002F\u002F 日付\n",[60,550,552,554,556,558,561],{"class":62,"line":551},27,[60,553,125],{"class":70},[60,555,158],{"class":94},[60,557,98],{"class":70},[60,559,560],{"class":77},"'date'",[60,562,104],{"class":70},[60,564,566,569,571],{"class":62,"line":565},28,[60,567,568],{"class":137},"  publishedAt",[60,570,141],{"class":66},[60,572,573],{"class":94}," Date\n",[60,575,577],{"class":62,"line":576},29,[60,578,85],{"emptyLinePlaceholder":84},[60,580,582],{"class":62,"line":581},30,[60,583,584],{"class":349},"  \u002F\u002F JSON\n",[60,586,588,590,592,594,597,600,602],{"class":62,"line":587},31,[60,589,125],{"class":70},[60,591,158],{"class":94},[60,593,98],{"class":70},[60,595,596],{"class":77},"'json'",[60,598,599],{"class":70},", { nullable: ",[60,601,404],{"class":144},[60,603,370],{"class":70},[60,605,607,610,612],{"class":62,"line":606},32,[60,608,609],{"class":137},"  metadata",[60,611,141],{"class":66},[60,613,614],{"class":144}," object\n",[60,616,618],{"class":62,"line":617},33,[60,619,201],{"class":70},[45,621,623],{"id":622},"nullを許容するカラム","NULLを許容するカラム",[50,625,627],{"className":52,"code":626,"language":54,"meta":55,"style":55},"@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  name: string\n\n  \u002F\u002F NULLを許容\n  @Column({ nullable: true })\n  phoneNumber: string | null\n\n  \u002F\u002F デフォルト値を設定\n  @Column({ default: 'user' })\n  role: string\n\n  \u002F\u002F NULLの初期値を明示（TypeScript側の型安全性のため）\n  @Column({ nullable: true })\n  bio: string | null = null\n}\n",[57,628,629,637,647,655,663,667,675,683,687,692,705,721,725,730,744,753,757,762,774,793],{"__ignoreMap":55},[60,630,631,633,635],{"class":62,"line":63},[60,632,91],{"class":70},[60,634,95],{"class":94},[60,636,131],{"class":70},[60,638,639,641,643,645],{"class":62,"line":81},[60,640,110],{"class":66},[60,642,113],{"class":66},[60,644,116],{"class":94},[60,646,119],{"class":70},[60,648,649,651,653],{"class":62,"line":88},[60,650,125],{"class":70},[60,652,128],{"class":94},[60,654,131],{"class":70},[60,656,657,659,661],{"class":62,"line":107},[60,658,138],{"class":137},[60,660,141],{"class":66},[60,662,145],{"class":144},[60,664,665],{"class":62,"line":122},[60,666,85],{"emptyLinePlaceholder":84},[60,668,669,671,673],{"class":62,"line":134},[60,670,125],{"class":70},[60,672,158],{"class":94},[60,674,131],{"class":70},[60,676,677,679,681],{"class":62,"line":148},[60,678,166],{"class":137},[60,680,141],{"class":66},[60,682,171],{"class":144},[60,684,685],{"class":62,"line":153},[60,686,85],{"emptyLinePlaceholder":84},[60,688,689],{"class":62,"line":163},[60,690,691],{"class":349},"  \u002F\u002F NULLを許容\n",[60,693,694,696,698,701,703],{"class":62,"line":174},[60,695,125],{"class":70},[60,697,158],{"class":94},[60,699,700],{"class":70},"({ nullable: ",[60,702,404],{"class":144},[60,704,370],{"class":70},[60,706,707,710,712,715,718],{"class":62,"line":179},[60,708,709],{"class":137},"  phoneNumber",[60,711,141],{"class":66},[60,713,714],{"class":144}," string",[60,716,717],{"class":66}," |",[60,719,720],{"class":144}," null\n",[60,722,723],{"class":62,"line":188},[60,724,85],{"emptyLinePlaceholder":84},[60,726,727],{"class":62,"line":198},[60,728,729],{"class":349},"  \u002F\u002F デフォルト値を設定\n",[60,731,732,734,736,739,742],{"class":62,"line":422},[60,733,125],{"class":70},[60,735,158],{"class":94},[60,737,738],{"class":70},"({ default: ",[60,740,741],{"class":77},"'user'",[60,743,370],{"class":70},[60,745,746,749,751],{"class":62,"line":428},[60,747,748],{"class":137},"  role",[60,750,141],{"class":66},[60,752,171],{"class":144},[60,754,755],{"class":62,"line":454},[60,756,85],{"emptyLinePlaceholder":84},[60,758,759],{"class":62,"line":464},[60,760,761],{"class":349},"  \u002F\u002F NULLの初期値を明示（TypeScript側の型安全性のため）\n",[60,763,764,766,768,770,772],{"class":62,"line":469},[60,765,125],{"class":70},[60,767,158],{"class":94},[60,769,700],{"class":70},[60,771,404],{"class":144},[60,773,370],{"class":70},[60,775,776,779,781,783,785,788,791],{"class":62,"line":475},[60,777,778],{"class":137},"  bio",[60,780,141],{"class":66},[60,782,714],{"class":144},[60,784,717],{"class":66},[60,786,787],{"class":144}," null",[60,789,790],{"class":66}," =",[60,792,720],{"class":144},[60,794,795],{"class":62,"line":494},[60,796,201],{"class":70},[45,798,799],{"id":799},"タイムスタンプカラム",[50,801,803],{"className":52,"code":802,"language":54,"meta":55,"style":55},"@Entity()\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  title: string\n\n  \u002F\u002F 作成日時（INSERT時に自動設定）\n  @CreateDateColumn()\n  readonly createdAt: Date\n\n  \u002F\u002F 更新日時（UPDATE時に自動更新）\n  @UpdateDateColumn()\n  readonly updatedAt: Date\n\n  \u002F\u002F 削除日時（ソフトデリート用）\n  @DeleteDateColumn()\n  readonly deletedAt: Date | null\n}\n",[57,804,805,813,824,832,840,844,852,861,865,870,879,891,895,900,909,920,924,929,938,954],{"__ignoreMap":55},[60,806,807,809,811],{"class":62,"line":63},[60,808,91],{"class":70},[60,810,95],{"class":94},[60,812,131],{"class":70},[60,814,815,817,819,822],{"class":62,"line":81},[60,816,110],{"class":66},[60,818,113],{"class":66},[60,820,821],{"class":94}," Post",[60,823,119],{"class":70},[60,825,826,828,830],{"class":62,"line":88},[60,827,125],{"class":70},[60,829,128],{"class":94},[60,831,131],{"class":70},[60,833,834,836,838],{"class":62,"line":107},[60,835,138],{"class":137},[60,837,141],{"class":66},[60,839,145],{"class":144},[60,841,842],{"class":62,"line":122},[60,843,85],{"emptyLinePlaceholder":84},[60,845,846,848,850],{"class":62,"line":134},[60,847,125],{"class":70},[60,849,158],{"class":94},[60,851,131],{"class":70},[60,853,854,857,859],{"class":62,"line":148},[60,855,856],{"class":137},"  title",[60,858,141],{"class":66},[60,860,171],{"class":144},[60,862,863],{"class":62,"line":153},[60,864,85],{"emptyLinePlaceholder":84},[60,866,867],{"class":62,"line":163},[60,868,869],{"class":349},"  \u002F\u002F 作成日時（INSERT時に自動設定）\n",[60,871,872,874,877],{"class":62,"line":174},[60,873,125],{"class":70},[60,875,876],{"class":94},"CreateDateColumn",[60,878,131],{"class":70},[60,880,881,884,887,889],{"class":62,"line":179},[60,882,883],{"class":66},"  readonly",[60,885,886],{"class":137}," createdAt",[60,888,141],{"class":66},[60,890,573],{"class":94},[60,892,893],{"class":62,"line":188},[60,894,85],{"emptyLinePlaceholder":84},[60,896,897],{"class":62,"line":198},[60,898,899],{"class":349},"  \u002F\u002F 更新日時（UPDATE時に自動更新）\n",[60,901,902,904,907],{"class":62,"line":422},[60,903,125],{"class":70},[60,905,906],{"class":94},"UpdateDateColumn",[60,908,131],{"class":70},[60,910,911,913,916,918],{"class":62,"line":428},[60,912,883],{"class":66},[60,914,915],{"class":137}," updatedAt",[60,917,141],{"class":66},[60,919,573],{"class":94},[60,921,922],{"class":62,"line":454},[60,923,85],{"emptyLinePlaceholder":84},[60,925,926],{"class":62,"line":464},[60,927,928],{"class":349},"  \u002F\u002F 削除日時（ソフトデリート用）\n",[60,930,931,933,936],{"class":62,"line":469},[60,932,125],{"class":70},[60,934,935],{"class":94},"DeleteDateColumn",[60,937,131],{"class":70},[60,939,940,942,945,947,950,952],{"class":62,"line":475},[60,941,883],{"class":66},[60,943,944],{"class":137}," deletedAt",[60,946,141],{"class":66},[60,948,949],{"class":94}," Date",[60,951,717],{"class":66},[60,953,720],{"class":144},[60,955,956],{"class":62,"line":494},[60,957,201],{"class":70},[10,959,960],{"id":960},"リレーションの定義",[45,962,964],{"id":963},"one-to-one1対1","One-to-One（1対1）",[50,966,968],{"className":52,"code":967,"language":54,"meta":55,"style":55},"\u002F\u002F User Entity\n@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  name: string\n\n  @OneToOne(() => Profile, (profile) => profile.user, {\n    cascade: true, \u002F\u002F Userを保存時にProfileも自動保存\n  })\n  @JoinColumn() \u002F\u002F 外部キーを持つ側に付ける\n  profile: Profile\n}\n\n\u002F\u002F Profile Entity\n@Entity()\nexport class Profile {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  bio: string\n\n  @OneToOne(() => User, (user) => user.profile)\n  user: User\n}\n",[57,969,970,975,983,993,1001,1009,1013,1021,1029,1033,1060,1073,1078,1091,1101,1105,1109,1114,1122,1133,1141,1149,1153,1161,1169,1173,1196,1206],{"__ignoreMap":55},[60,971,972],{"class":62,"line":63},[60,973,974],{"class":349},"\u002F\u002F User Entity\n",[60,976,977,979,981],{"class":62,"line":81},[60,978,91],{"class":70},[60,980,95],{"class":94},[60,982,131],{"class":70},[60,984,985,987,989,991],{"class":62,"line":88},[60,986,110],{"class":66},[60,988,113],{"class":66},[60,990,116],{"class":94},[60,992,119],{"class":70},[60,994,995,997,999],{"class":62,"line":107},[60,996,125],{"class":70},[60,998,128],{"class":94},[60,1000,131],{"class":70},[60,1002,1003,1005,1007],{"class":62,"line":122},[60,1004,138],{"class":137},[60,1006,141],{"class":66},[60,1008,145],{"class":144},[60,1010,1011],{"class":62,"line":134},[60,1012,85],{"emptyLinePlaceholder":84},[60,1014,1015,1017,1019],{"class":62,"line":148},[60,1016,125],{"class":70},[60,1018,158],{"class":94},[60,1020,131],{"class":70},[60,1022,1023,1025,1027],{"class":62,"line":153},[60,1024,166],{"class":137},[60,1026,141],{"class":66},[60,1028,171],{"class":144},[60,1030,1031],{"class":62,"line":163},[60,1032,85],{"emptyLinePlaceholder":84},[60,1034,1035,1037,1040,1043,1046,1049,1052,1055,1057],{"class":62,"line":174},[60,1036,125],{"class":70},[60,1038,1039],{"class":94},"OneToOne",[60,1041,1042],{"class":70},"(() ",[60,1044,1045],{"class":66},"=>",[60,1047,1048],{"class":70}," Profile, (",[60,1050,1051],{"class":137},"profile",[60,1053,1054],{"class":70},") ",[60,1056,1045],{"class":66},[60,1058,1059],{"class":70}," profile.user, {\n",[60,1061,1062,1065,1067,1070],{"class":62,"line":179},[60,1063,1064],{"class":70},"    cascade: ",[60,1066,404],{"class":144},[60,1068,1069],{"class":70},", ",[60,1071,1072],{"class":349},"\u002F\u002F Userを保存時にProfileも自動保存\n",[60,1074,1075],{"class":62,"line":188},[60,1076,1077],{"class":70},"  })\n",[60,1079,1080,1082,1085,1088],{"class":62,"line":198},[60,1081,125],{"class":70},[60,1083,1084],{"class":94},"JoinColumn",[60,1086,1087],{"class":70},"() ",[60,1089,1090],{"class":349},"\u002F\u002F 外部キーを持つ側に付ける\n",[60,1092,1093,1096,1098],{"class":62,"line":422},[60,1094,1095],{"class":137},"  profile",[60,1097,141],{"class":66},[60,1099,1100],{"class":94}," Profile\n",[60,1102,1103],{"class":62,"line":428},[60,1104,201],{"class":70},[60,1106,1107],{"class":62,"line":454},[60,1108,85],{"emptyLinePlaceholder":84},[60,1110,1111],{"class":62,"line":464},[60,1112,1113],{"class":349},"\u002F\u002F Profile Entity\n",[60,1115,1116,1118,1120],{"class":62,"line":469},[60,1117,91],{"class":70},[60,1119,95],{"class":94},[60,1121,131],{"class":70},[60,1123,1124,1126,1128,1131],{"class":62,"line":475},[60,1125,110],{"class":66},[60,1127,113],{"class":66},[60,1129,1130],{"class":94}," Profile",[60,1132,119],{"class":70},[60,1134,1135,1137,1139],{"class":62,"line":494},[60,1136,125],{"class":70},[60,1138,128],{"class":94},[60,1140,131],{"class":70},[60,1142,1143,1145,1147],{"class":62,"line":505},[60,1144,138],{"class":137},[60,1146,141],{"class":66},[60,1148,145],{"class":144},[60,1150,1151],{"class":62,"line":510},[60,1152,85],{"emptyLinePlaceholder":84},[60,1154,1155,1157,1159],{"class":62,"line":516},[60,1156,125],{"class":70},[60,1158,158],{"class":94},[60,1160,131],{"class":70},[60,1162,1163,1165,1167],{"class":62,"line":530},[60,1164,778],{"class":137},[60,1166,141],{"class":66},[60,1168,171],{"class":144},[60,1170,1171],{"class":62,"line":540},[60,1172,85],{"emptyLinePlaceholder":84},[60,1174,1175,1177,1179,1181,1183,1186,1189,1191,1193],{"class":62,"line":545},[60,1176,125],{"class":70},[60,1178,1039],{"class":94},[60,1180,1042],{"class":70},[60,1182,1045],{"class":66},[60,1184,1185],{"class":70}," User, (",[60,1187,1188],{"class":137},"user",[60,1190,1054],{"class":70},[60,1192,1045],{"class":66},[60,1194,1195],{"class":70}," user.profile)\n",[60,1197,1198,1201,1203],{"class":62,"line":551},[60,1199,1200],{"class":137},"  user",[60,1202,141],{"class":66},[60,1204,1205],{"class":94}," User\n",[60,1207,1208],{"class":62,"line":565},[60,1209,201],{"class":70},[45,1211,1213],{"id":1212},"one-to-many-many-to-one1対多","One-to-Many \u002F Many-to-One（1対多）",[50,1215,1217],{"className":52,"code":1216,"language":54,"meta":55,"style":55},"\u002F\u002F User Entity（親）\n@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  name: string\n\n  @OneToMany(() => Post, (post) => post.user, {\n    cascade: true, \u002F\u002F Userを保存時にPostも自動保存\n  })\n  posts: Post[]\n}\n\n\u002F\u002F Post Entity（子）\n@Entity()\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  title: string\n\n  @ManyToOne(() => User, (user) => user.posts, {\n    onDelete: 'CASCADE', \u002F\u002F Userが削除されたらPostも削除\n  })\n  @JoinColumn({ name: 'user_id' })\n  user: User\n\n  @Column()\n  userId: number \u002F\u002F 外部キーのカラム\n}\n",[57,1218,1219,1224,1232,1242,1250,1258,1262,1270,1278,1282,1306,1317,1321,1333,1337,1341,1346,1354,1364,1372,1380,1384,1392,1400,1404,1426,1439,1443,1457,1465,1469,1477,1490],{"__ignoreMap":55},[60,1220,1221],{"class":62,"line":63},[60,1222,1223],{"class":349},"\u002F\u002F User Entity（親）\n",[60,1225,1226,1228,1230],{"class":62,"line":81},[60,1227,91],{"class":70},[60,1229,95],{"class":94},[60,1231,131],{"class":70},[60,1233,1234,1236,1238,1240],{"class":62,"line":88},[60,1235,110],{"class":66},[60,1237,113],{"class":66},[60,1239,116],{"class":94},[60,1241,119],{"class":70},[60,1243,1244,1246,1248],{"class":62,"line":107},[60,1245,125],{"class":70},[60,1247,128],{"class":94},[60,1249,131],{"class":70},[60,1251,1252,1254,1256],{"class":62,"line":122},[60,1253,138],{"class":137},[60,1255,141],{"class":66},[60,1257,145],{"class":144},[60,1259,1260],{"class":62,"line":134},[60,1261,85],{"emptyLinePlaceholder":84},[60,1263,1264,1266,1268],{"class":62,"line":148},[60,1265,125],{"class":70},[60,1267,158],{"class":94},[60,1269,131],{"class":70},[60,1271,1272,1274,1276],{"class":62,"line":153},[60,1273,166],{"class":137},[60,1275,141],{"class":66},[60,1277,171],{"class":144},[60,1279,1280],{"class":62,"line":163},[60,1281,85],{"emptyLinePlaceholder":84},[60,1283,1284,1286,1289,1291,1293,1296,1299,1301,1303],{"class":62,"line":174},[60,1285,125],{"class":70},[60,1287,1288],{"class":94},"OneToMany",[60,1290,1042],{"class":70},[60,1292,1045],{"class":66},[60,1294,1295],{"class":70}," Post, (",[60,1297,1298],{"class":137},"post",[60,1300,1054],{"class":70},[60,1302,1045],{"class":66},[60,1304,1305],{"class":70}," post.user, {\n",[60,1307,1308,1310,1312,1314],{"class":62,"line":179},[60,1309,1064],{"class":70},[60,1311,404],{"class":144},[60,1313,1069],{"class":70},[60,1315,1316],{"class":349},"\u002F\u002F Userを保存時にPostも自動保存\n",[60,1318,1319],{"class":62,"line":188},[60,1320,1077],{"class":70},[60,1322,1323,1326,1328,1330],{"class":62,"line":198},[60,1324,1325],{"class":137},"  posts",[60,1327,141],{"class":66},[60,1329,821],{"class":94},[60,1331,1332],{"class":70},"[]\n",[60,1334,1335],{"class":62,"line":422},[60,1336,201],{"class":70},[60,1338,1339],{"class":62,"line":428},[60,1340,85],{"emptyLinePlaceholder":84},[60,1342,1343],{"class":62,"line":454},[60,1344,1345],{"class":349},"\u002F\u002F Post Entity（子）\n",[60,1347,1348,1350,1352],{"class":62,"line":464},[60,1349,91],{"class":70},[60,1351,95],{"class":94},[60,1353,131],{"class":70},[60,1355,1356,1358,1360,1362],{"class":62,"line":469},[60,1357,110],{"class":66},[60,1359,113],{"class":66},[60,1361,821],{"class":94},[60,1363,119],{"class":70},[60,1365,1366,1368,1370],{"class":62,"line":475},[60,1367,125],{"class":70},[60,1369,128],{"class":94},[60,1371,131],{"class":70},[60,1373,1374,1376,1378],{"class":62,"line":494},[60,1375,138],{"class":137},[60,1377,141],{"class":66},[60,1379,145],{"class":144},[60,1381,1382],{"class":62,"line":505},[60,1383,85],{"emptyLinePlaceholder":84},[60,1385,1386,1388,1390],{"class":62,"line":510},[60,1387,125],{"class":70},[60,1389,158],{"class":94},[60,1391,131],{"class":70},[60,1393,1394,1396,1398],{"class":62,"line":516},[60,1395,856],{"class":137},[60,1397,141],{"class":66},[60,1399,171],{"class":144},[60,1401,1402],{"class":62,"line":530},[60,1403,85],{"emptyLinePlaceholder":84},[60,1405,1406,1408,1411,1413,1415,1417,1419,1421,1423],{"class":62,"line":540},[60,1407,125],{"class":70},[60,1409,1410],{"class":94},"ManyToOne",[60,1412,1042],{"class":70},[60,1414,1045],{"class":66},[60,1416,1185],{"class":70},[60,1418,1188],{"class":137},[60,1420,1054],{"class":70},[60,1422,1045],{"class":66},[60,1424,1425],{"class":70}," user.posts, {\n",[60,1427,1428,1431,1434,1436],{"class":62,"line":545},[60,1429,1430],{"class":70},"    onDelete: ",[60,1432,1433],{"class":77},"'CASCADE'",[60,1435,1069],{"class":70},[60,1437,1438],{"class":349},"\u002F\u002F Userが削除されたらPostも削除\n",[60,1440,1441],{"class":62,"line":551},[60,1442,1077],{"class":70},[60,1444,1445,1447,1449,1452,1455],{"class":62,"line":565},[60,1446,125],{"class":70},[60,1448,1084],{"class":94},[60,1450,1451],{"class":70},"({ name: ",[60,1453,1454],{"class":77},"'user_id'",[60,1456,370],{"class":70},[60,1458,1459,1461,1463],{"class":62,"line":576},[60,1460,1200],{"class":137},[60,1462,141],{"class":66},[60,1464,1205],{"class":94},[60,1466,1467],{"class":62,"line":581},[60,1468,85],{"emptyLinePlaceholder":84},[60,1470,1471,1473,1475],{"class":62,"line":587},[60,1472,125],{"class":70},[60,1474,158],{"class":94},[60,1476,131],{"class":70},[60,1478,1479,1482,1484,1487],{"class":62,"line":606},[60,1480,1481],{"class":137},"  userId",[60,1483,141],{"class":66},[60,1485,1486],{"class":144}," number",[60,1488,1489],{"class":349}," \u002F\u002F 外部キーのカラム\n",[60,1491,1492],{"class":62,"line":617},[60,1493,201],{"class":70},[45,1495,1497],{"id":1496},"many-to-many多対多","Many-to-Many（多対多）",[50,1499,1501],{"className":52,"code":1500,"language":54,"meta":55,"style":55},"\u002F\u002F Student Entity\n@Entity()\nexport class Student {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  name: string\n\n  @ManyToMany(() => Course, (course) => course.students)\n  @JoinTable({ \u002F\u002F 中間テーブルを作成する側に付ける\n    name: 'student_courses',\n    joinColumn: { name: 'student_id' },\n    inverseJoinColumn: { name: 'course_id' },\n  })\n  courses: Course[]\n}\n\n\u002F\u002F Course Entity\n@Entity()\nexport class Course {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @Column()\n  title: string\n\n  @ManyToMany(() => Student, (student) => student.courses)\n  students: Student[]\n}\n",[57,1502,1503,1508,1516,1527,1535,1543,1547,1555,1563,1567,1591,1604,1615,1626,1636,1640,1652,1656,1660,1665,1673,1683,1691,1699,1703,1711,1719,1723,1746,1757],{"__ignoreMap":55},[60,1504,1505],{"class":62,"line":63},[60,1506,1507],{"class":349},"\u002F\u002F Student Entity\n",[60,1509,1510,1512,1514],{"class":62,"line":81},[60,1511,91],{"class":70},[60,1513,95],{"class":94},[60,1515,131],{"class":70},[60,1517,1518,1520,1522,1525],{"class":62,"line":88},[60,1519,110],{"class":66},[60,1521,113],{"class":66},[60,1523,1524],{"class":94}," Student",[60,1526,119],{"class":70},[60,1528,1529,1531,1533],{"class":62,"line":107},[60,1530,125],{"class":70},[60,1532,128],{"class":94},[60,1534,131],{"class":70},[60,1536,1537,1539,1541],{"class":62,"line":122},[60,1538,138],{"class":137},[60,1540,141],{"class":66},[60,1542,145],{"class":144},[60,1544,1545],{"class":62,"line":134},[60,1546,85],{"emptyLinePlaceholder":84},[60,1548,1549,1551,1553],{"class":62,"line":148},[60,1550,125],{"class":70},[60,1552,158],{"class":94},[60,1554,131],{"class":70},[60,1556,1557,1559,1561],{"class":62,"line":153},[60,1558,166],{"class":137},[60,1560,141],{"class":66},[60,1562,171],{"class":144},[60,1564,1565],{"class":62,"line":163},[60,1566,85],{"emptyLinePlaceholder":84},[60,1568,1569,1571,1574,1576,1578,1581,1584,1586,1588],{"class":62,"line":174},[60,1570,125],{"class":70},[60,1572,1573],{"class":94},"ManyToMany",[60,1575,1042],{"class":70},[60,1577,1045],{"class":66},[60,1579,1580],{"class":70}," Course, (",[60,1582,1583],{"class":137},"course",[60,1585,1054],{"class":70},[60,1587,1045],{"class":66},[60,1589,1590],{"class":70}," course.students)\n",[60,1592,1593,1595,1598,1601],{"class":62,"line":179},[60,1594,125],{"class":70},[60,1596,1597],{"class":94},"JoinTable",[60,1599,1600],{"class":70},"({ ",[60,1602,1603],{"class":349},"\u002F\u002F 中間テーブルを作成する側に付ける\n",[60,1605,1606,1609,1612],{"class":62,"line":188},[60,1607,1608],{"class":70},"    name: ",[60,1610,1611],{"class":77},"'student_courses'",[60,1613,1614],{"class":70},",\n",[60,1616,1617,1620,1623],{"class":62,"line":198},[60,1618,1619],{"class":70},"    joinColumn: { name: ",[60,1621,1622],{"class":77},"'student_id'",[60,1624,1625],{"class":70}," },\n",[60,1627,1628,1631,1634],{"class":62,"line":422},[60,1629,1630],{"class":70},"    inverseJoinColumn: { name: ",[60,1632,1633],{"class":77},"'course_id'",[60,1635,1625],{"class":70},[60,1637,1638],{"class":62,"line":428},[60,1639,1077],{"class":70},[60,1641,1642,1645,1647,1650],{"class":62,"line":454},[60,1643,1644],{"class":137},"  courses",[60,1646,141],{"class":66},[60,1648,1649],{"class":94}," Course",[60,1651,1332],{"class":70},[60,1653,1654],{"class":62,"line":464},[60,1655,201],{"class":70},[60,1657,1658],{"class":62,"line":469},[60,1659,85],{"emptyLinePlaceholder":84},[60,1661,1662],{"class":62,"line":475},[60,1663,1664],{"class":349},"\u002F\u002F Course Entity\n",[60,1666,1667,1669,1671],{"class":62,"line":494},[60,1668,91],{"class":70},[60,1670,95],{"class":94},[60,1672,131],{"class":70},[60,1674,1675,1677,1679,1681],{"class":62,"line":505},[60,1676,110],{"class":66},[60,1678,113],{"class":66},[60,1680,1649],{"class":94},[60,1682,119],{"class":70},[60,1684,1685,1687,1689],{"class":62,"line":510},[60,1686,125],{"class":70},[60,1688,128],{"class":94},[60,1690,131],{"class":70},[60,1692,1693,1695,1697],{"class":62,"line":516},[60,1694,138],{"class":137},[60,1696,141],{"class":66},[60,1698,145],{"class":144},[60,1700,1701],{"class":62,"line":530},[60,1702,85],{"emptyLinePlaceholder":84},[60,1704,1705,1707,1709],{"class":62,"line":540},[60,1706,125],{"class":70},[60,1708,158],{"class":94},[60,1710,131],{"class":70},[60,1712,1713,1715,1717],{"class":62,"line":545},[60,1714,856],{"class":137},[60,1716,141],{"class":66},[60,1718,171],{"class":144},[60,1720,1721],{"class":62,"line":551},[60,1722,85],{"emptyLinePlaceholder":84},[60,1724,1725,1727,1729,1731,1733,1736,1739,1741,1743],{"class":62,"line":565},[60,1726,125],{"class":70},[60,1728,1573],{"class":94},[60,1730,1042],{"class":70},[60,1732,1045],{"class":66},[60,1734,1735],{"class":70}," Student, (",[60,1737,1738],{"class":137},"student",[60,1740,1054],{"class":70},[60,1742,1045],{"class":66},[60,1744,1745],{"class":70}," student.courses)\n",[60,1747,1748,1751,1753,1755],{"class":62,"line":576},[60,1749,1750],{"class":137},"  students",[60,1752,141],{"class":66},[60,1754,1524],{"class":94},[60,1756,1332],{"class":70},[60,1758,1759],{"class":62,"line":581},[60,1760,201],{"class":70},[10,1762,1763],{"id":1763},"リレーションオプションの詳細",[45,1765,1767],{"id":1766},"cascadeカスケード","cascade（カスケード）",[15,1769,1770],{},"親エンティティの操作を子エンティティに伝播させます。",[50,1772,1774],{"className":52,"code":1773,"language":54,"meta":55,"style":55},"@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @OneToMany(() => Post, (post) => post.user, {\n    cascade: true, \u002F\u002F insert, update, remove すべて\n    \u002F\u002F または個別に指定\n    \u002F\u002F cascade: ['insert', 'update']\n  })\n  posts: Post[]\n}\n\n\u002F\u002F 使用例\nconst user = new User()\nuser.posts = [new Post(), new Post()]\nawait repository.save(user) \u002F\u002F Userと一緒にPostsも保存される\n",[57,1775,1776,1784,1794,1802,1810,1814,1834,1845,1850,1855,1859,1869,1873,1877,1882,1899,1925],{"__ignoreMap":55},[60,1777,1778,1780,1782],{"class":62,"line":63},[60,1779,91],{"class":70},[60,1781,95],{"class":94},[60,1783,131],{"class":70},[60,1785,1786,1788,1790,1792],{"class":62,"line":81},[60,1787,110],{"class":66},[60,1789,113],{"class":66},[60,1791,116],{"class":94},[60,1793,119],{"class":70},[60,1795,1796,1798,1800],{"class":62,"line":88},[60,1797,125],{"class":70},[60,1799,128],{"class":94},[60,1801,131],{"class":70},[60,1803,1804,1806,1808],{"class":62,"line":107},[60,1805,138],{"class":137},[60,1807,141],{"class":66},[60,1809,145],{"class":144},[60,1811,1812],{"class":62,"line":122},[60,1813,85],{"emptyLinePlaceholder":84},[60,1815,1816,1818,1820,1822,1824,1826,1828,1830,1832],{"class":62,"line":134},[60,1817,125],{"class":70},[60,1819,1288],{"class":94},[60,1821,1042],{"class":70},[60,1823,1045],{"class":66},[60,1825,1295],{"class":70},[60,1827,1298],{"class":137},[60,1829,1054],{"class":70},[60,1831,1045],{"class":66},[60,1833,1305],{"class":70},[60,1835,1836,1838,1840,1842],{"class":62,"line":148},[60,1837,1064],{"class":70},[60,1839,404],{"class":144},[60,1841,1069],{"class":70},[60,1843,1844],{"class":349},"\u002F\u002F insert, update, remove すべて\n",[60,1846,1847],{"class":62,"line":153},[60,1848,1849],{"class":349},"    \u002F\u002F または個別に指定\n",[60,1851,1852],{"class":62,"line":163},[60,1853,1854],{"class":349},"    \u002F\u002F cascade: ['insert', 'update']\n",[60,1856,1857],{"class":62,"line":174},[60,1858,1077],{"class":70},[60,1860,1861,1863,1865,1867],{"class":62,"line":179},[60,1862,1325],{"class":137},[60,1864,141],{"class":66},[60,1866,821],{"class":94},[60,1868,1332],{"class":70},[60,1870,1871],{"class":62,"line":188},[60,1872,201],{"class":70},[60,1874,1875],{"class":62,"line":198},[60,1876,85],{"emptyLinePlaceholder":84},[60,1878,1879],{"class":62,"line":422},[60,1880,1881],{"class":349},"\u002F\u002F 使用例\n",[60,1883,1884,1887,1890,1892,1895,1897],{"class":62,"line":428},[60,1885,1886],{"class":66},"const",[60,1888,1889],{"class":144}," user",[60,1891,790],{"class":66},[60,1893,1894],{"class":66}," new",[60,1896,116],{"class":94},[60,1898,131],{"class":70},[60,1900,1901,1904,1907,1910,1913,1915,1918,1920,1922],{"class":62,"line":454},[60,1902,1903],{"class":70},"user.posts ",[60,1905,1906],{"class":66},"=",[60,1908,1909],{"class":70}," [",[60,1911,1912],{"class":66},"new",[60,1914,821],{"class":94},[60,1916,1917],{"class":70},"(), ",[60,1919,1912],{"class":66},[60,1921,821],{"class":94},[60,1923,1924],{"class":70},"()]\n",[60,1926,1927,1930,1933,1936,1939],{"class":62,"line":464},[60,1928,1929],{"class":66},"await",[60,1931,1932],{"class":70}," repository.",[60,1934,1935],{"class":94},"save",[60,1937,1938],{"class":70},"(user) ",[60,1940,1941],{"class":349},"\u002F\u002F Userと一緒にPostsも保存される\n",[45,1943,1945],{"id":1944},"eager-lazy読み込み方式","eager \u002F lazy（読み込み方式）",[50,1947,1949],{"className":52,"code":1948,"language":54,"meta":55,"style":55},"@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  \u002F\u002F Eager Loading: Userを取得時に自動でPostsも取得\n  @OneToMany(() => Post, (post) => post.user, {\n    eager: true,\n  })\n  posts: Post[]\n}\n\n\u002F\u002F Lazy Loading\n@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  \u002F\u002F Promise型にする\n  @OneToMany(() => Post, (post) => post.user)\n  posts: Promise\u003CPost[]>\n}\n\n\u002F\u002F 使用例\nconst user = await userRepository.findOne({ where: { id: 1 } })\nconst posts = await user.posts \u002F\u002F Promiseをawaitで解決\n",[57,1950,1951,1959,1969,1977,1985,1989,1994,2014,2023,2027,2037,2041,2045,2050,2058,2068,2076,2084,2088,2093,2114,2132,2136,2140,2144,2170],{"__ignoreMap":55},[60,1952,1953,1955,1957],{"class":62,"line":63},[60,1954,91],{"class":70},[60,1956,95],{"class":94},[60,1958,131],{"class":70},[60,1960,1961,1963,1965,1967],{"class":62,"line":81},[60,1962,110],{"class":66},[60,1964,113],{"class":66},[60,1966,116],{"class":94},[60,1968,119],{"class":70},[60,1970,1971,1973,1975],{"class":62,"line":88},[60,1972,125],{"class":70},[60,1974,128],{"class":94},[60,1976,131],{"class":70},[60,1978,1979,1981,1983],{"class":62,"line":107},[60,1980,138],{"class":137},[60,1982,141],{"class":66},[60,1984,145],{"class":144},[60,1986,1987],{"class":62,"line":122},[60,1988,85],{"emptyLinePlaceholder":84},[60,1990,1991],{"class":62,"line":134},[60,1992,1993],{"class":349},"  \u002F\u002F Eager Loading: Userを取得時に自動でPostsも取得\n",[60,1995,1996,1998,2000,2002,2004,2006,2008,2010,2012],{"class":62,"line":148},[60,1997,125],{"class":70},[60,1999,1288],{"class":94},[60,2001,1042],{"class":70},[60,2003,1045],{"class":66},[60,2005,1295],{"class":70},[60,2007,1298],{"class":137},[60,2009,1054],{"class":70},[60,2011,1045],{"class":66},[60,2013,1305],{"class":70},[60,2015,2016,2019,2021],{"class":62,"line":153},[60,2017,2018],{"class":70},"    eager: ",[60,2020,404],{"class":144},[60,2022,1614],{"class":70},[60,2024,2025],{"class":62,"line":163},[60,2026,1077],{"class":70},[60,2028,2029,2031,2033,2035],{"class":62,"line":174},[60,2030,1325],{"class":137},[60,2032,141],{"class":66},[60,2034,821],{"class":94},[60,2036,1332],{"class":70},[60,2038,2039],{"class":62,"line":179},[60,2040,201],{"class":70},[60,2042,2043],{"class":62,"line":188},[60,2044,85],{"emptyLinePlaceholder":84},[60,2046,2047],{"class":62,"line":198},[60,2048,2049],{"class":349},"\u002F\u002F Lazy Loading\n",[60,2051,2052,2054,2056],{"class":62,"line":422},[60,2053,91],{"class":70},[60,2055,95],{"class":94},[60,2057,131],{"class":70},[60,2059,2060,2062,2064,2066],{"class":62,"line":428},[60,2061,110],{"class":66},[60,2063,113],{"class":66},[60,2065,116],{"class":94},[60,2067,119],{"class":70},[60,2069,2070,2072,2074],{"class":62,"line":454},[60,2071,125],{"class":70},[60,2073,128],{"class":94},[60,2075,131],{"class":70},[60,2077,2078,2080,2082],{"class":62,"line":464},[60,2079,138],{"class":137},[60,2081,141],{"class":66},[60,2083,145],{"class":144},[60,2085,2086],{"class":62,"line":469},[60,2087,85],{"emptyLinePlaceholder":84},[60,2089,2090],{"class":62,"line":475},[60,2091,2092],{"class":349},"  \u002F\u002F Promise型にする\n",[60,2094,2095,2097,2099,2101,2103,2105,2107,2109,2111],{"class":62,"line":494},[60,2096,125],{"class":70},[60,2098,1288],{"class":94},[60,2100,1042],{"class":70},[60,2102,1045],{"class":66},[60,2104,1295],{"class":70},[60,2106,1298],{"class":137},[60,2108,1054],{"class":70},[60,2110,1045],{"class":66},[60,2112,2113],{"class":70}," post.user)\n",[60,2115,2116,2118,2120,2123,2126,2129],{"class":62,"line":505},[60,2117,1325],{"class":137},[60,2119,141],{"class":66},[60,2121,2122],{"class":94}," Promise",[60,2124,2125],{"class":70},"\u003C",[60,2127,2128],{"class":94},"Post",[60,2130,2131],{"class":70},"[]>\n",[60,2133,2134],{"class":62,"line":510},[60,2135,201],{"class":70},[60,2137,2138],{"class":62,"line":516},[60,2139,85],{"emptyLinePlaceholder":84},[60,2141,2142],{"class":62,"line":530},[60,2143,1881],{"class":349},[60,2145,2146,2148,2150,2152,2155,2158,2161,2164,2167],{"class":62,"line":540},[60,2147,1886],{"class":66},[60,2149,1889],{"class":144},[60,2151,790],{"class":66},[60,2153,2154],{"class":66}," await",[60,2156,2157],{"class":70}," userRepository.",[60,2159,2160],{"class":94},"findOne",[60,2162,2163],{"class":70},"({ where: { id: ",[60,2165,2166],{"class":144},"1",[60,2168,2169],{"class":70}," } })\n",[60,2171,2172,2174,2177,2179,2181,2184],{"class":62,"line":545},[60,2173,1886],{"class":66},[60,2175,2176],{"class":144}," posts",[60,2178,790],{"class":66},[60,2180,2154],{"class":66},[60,2182,2183],{"class":70}," user.posts ",[60,2185,2186],{"class":349},"\u002F\u002F Promiseをawaitで解決\n",[45,2188,2190],{"id":2189},"ondelete-onupdate外部キー制約","onDelete \u002F onUpdate（外部キー制約）",[50,2192,2194],{"className":52,"code":2193,"language":54,"meta":55,"style":55},"@Entity()\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @ManyToOne(() => User, (user) => user.posts, {\n    onDelete: 'CASCADE',    \u002F\u002F Userが削除されたらPostも削除\n    \u002F\u002F onDelete: 'SET NULL', \u002F\u002F Userが削除されたらuser_idをNULLに\n    \u002F\u002F onDelete: 'RESTRICT', \u002F\u002F Postが存在する場合はUserを削除不可\n    onUpdate: 'CASCADE',    \u002F\u002F UserのIDが変更されたらuser_idも更新\n  })\n  @JoinColumn({ name: 'user_id' })\n  user: User\n}\n",[57,2195,2196,2204,2214,2222,2230,2234,2254,2265,2273,2281,2293,2297,2309,2317],{"__ignoreMap":55},[60,2197,2198,2200,2202],{"class":62,"line":63},[60,2199,91],{"class":70},[60,2201,95],{"class":94},[60,2203,131],{"class":70},[60,2205,2206,2208,2210,2212],{"class":62,"line":81},[60,2207,110],{"class":66},[60,2209,113],{"class":66},[60,2211,821],{"class":94},[60,2213,119],{"class":70},[60,2215,2216,2218,2220],{"class":62,"line":88},[60,2217,125],{"class":70},[60,2219,128],{"class":94},[60,2221,131],{"class":70},[60,2223,2224,2226,2228],{"class":62,"line":107},[60,2225,138],{"class":137},[60,2227,141],{"class":66},[60,2229,145],{"class":144},[60,2231,2232],{"class":62,"line":122},[60,2233,85],{"emptyLinePlaceholder":84},[60,2235,2236,2238,2240,2242,2244,2246,2248,2250,2252],{"class":62,"line":134},[60,2237,125],{"class":70},[60,2239,1410],{"class":94},[60,2241,1042],{"class":70},[60,2243,1045],{"class":66},[60,2245,1185],{"class":70},[60,2247,1188],{"class":137},[60,2249,1054],{"class":70},[60,2251,1045],{"class":66},[60,2253,1425],{"class":70},[60,2255,2256,2258,2260,2263],{"class":62,"line":148},[60,2257,1430],{"class":70},[60,2259,1433],{"class":77},[60,2261,2262],{"class":70},",    ",[60,2264,1438],{"class":349},[60,2266,2267,2270],{"class":62,"line":153},[60,2268,2269],{"class":349},"    \u002F\u002F onDelete: 'SET NULL',",[60,2271,2272],{"class":349}," \u002F\u002F Userが削除されたらuser_idをNULLに\n",[60,2274,2275,2278],{"class":62,"line":163},[60,2276,2277],{"class":349},"    \u002F\u002F onDelete: 'RESTRICT',",[60,2279,2280],{"class":349}," \u002F\u002F Postが存在する場合はUserを削除不可\n",[60,2282,2283,2286,2288,2290],{"class":62,"line":174},[60,2284,2285],{"class":70},"    onUpdate: ",[60,2287,1433],{"class":77},[60,2289,2262],{"class":70},[60,2291,2292],{"class":349},"\u002F\u002F UserのIDが変更されたらuser_idも更新\n",[60,2294,2295],{"class":62,"line":179},[60,2296,1077],{"class":70},[60,2298,2299,2301,2303,2305,2307],{"class":62,"line":188},[60,2300,125],{"class":70},[60,2302,1084],{"class":94},[60,2304,1451],{"class":70},[60,2306,1454],{"class":77},[60,2308,370],{"class":70},[60,2310,2311,2313,2315],{"class":62,"line":198},[60,2312,1200],{"class":137},[60,2314,141],{"class":66},[60,2316,1205],{"class":94},[60,2318,2319],{"class":62,"line":422},[60,2320,201],{"class":70},[10,2322,2323],{"id":2323},"パフォーマンス最適化",[45,2325,2327],{"id":2326},"createforeignkeyconstraints","createForeignKeyConstraints",[15,2329,2330],{},"外部キー制約を作成しないことでパフォーマンスを向上させます。",[50,2332,2334],{"className":52,"code":2333,"language":54,"meta":55,"style":55},"@Entity()\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @ManyToOne(() => User, (user) => user.posts, {\n    createForeignKeyConstraints: false, \u002F\u002F 外部キー制約を作成しない\n  })\n  @JoinColumn({ name: 'user_id' })\n  user: User\n}\n",[57,2335,2336,2344,2354,2362,2370,2374,2394,2407,2411,2423,2431],{"__ignoreMap":55},[60,2337,2338,2340,2342],{"class":62,"line":63},[60,2339,91],{"class":70},[60,2341,95],{"class":94},[60,2343,131],{"class":70},[60,2345,2346,2348,2350,2352],{"class":62,"line":81},[60,2347,110],{"class":66},[60,2349,113],{"class":66},[60,2351,821],{"class":94},[60,2353,119],{"class":70},[60,2355,2356,2358,2360],{"class":62,"line":88},[60,2357,125],{"class":70},[60,2359,128],{"class":94},[60,2361,131],{"class":70},[60,2363,2364,2366,2368],{"class":62,"line":107},[60,2365,138],{"class":137},[60,2367,141],{"class":66},[60,2369,145],{"class":144},[60,2371,2372],{"class":62,"line":122},[60,2373,85],{"emptyLinePlaceholder":84},[60,2375,2376,2378,2380,2382,2384,2386,2388,2390,2392],{"class":62,"line":134},[60,2377,125],{"class":70},[60,2379,1410],{"class":94},[60,2381,1042],{"class":70},[60,2383,1045],{"class":66},[60,2385,1185],{"class":70},[60,2387,1188],{"class":137},[60,2389,1054],{"class":70},[60,2391,1045],{"class":66},[60,2393,1425],{"class":70},[60,2395,2396,2399,2402,2404],{"class":62,"line":148},[60,2397,2398],{"class":70},"    createForeignKeyConstraints: ",[60,2400,2401],{"class":144},"false",[60,2403,1069],{"class":70},[60,2405,2406],{"class":349},"\u002F\u002F 外部キー制約を作成しない\n",[60,2408,2409],{"class":62,"line":153},[60,2410,1077],{"class":70},[60,2412,2413,2415,2417,2419,2421],{"class":62,"line":163},[60,2414,125],{"class":70},[60,2416,1084],{"class":94},[60,2418,1451],{"class":70},[60,2420,1454],{"class":77},[60,2422,370],{"class":70},[60,2424,2425,2427,2429],{"class":62,"line":174},[60,2426,1200],{"class":137},[60,2428,141],{"class":66},[60,2430,1205],{"class":94},[60,2432,2433],{"class":62,"line":179},[60,2434,201],{"class":70},[15,2436,2437],{},[21,2438,2439],{},"注意点",[25,2441,2442,2445],{},[28,2443,2444],{},"データ整合性はアプリケーション側で保証する必要がある",[28,2446,2447],{},"高速な書き込みが必要な場合に有効",[45,2449,2450],{"id":2450},"persistence",[15,2452,2453],{},"保存時の余分なクエリを抑制します。",[50,2455,2457],{"className":52,"code":2456,"language":54,"meta":55,"style":55},"@Entity()\nexport class Post {\n  @PrimaryGeneratedColumn()\n  id: number\n\n  @ManyToOne(() => User, (user) => user.posts, {\n    persistence: false, \u002F\u002F 保存時にリレーションを永続化しない\n  })\n  @JoinColumn({ name: 'user_id' })\n  user: User\n\n  @Column()\n  userId: number \u002F\u002F 外部キーは直接操作\n}\n\n\u002F\u002F 使用例\nconst post = new Post()\npost.title = 'Hello'\npost.userId = 1 \u002F\u002F userオブジェクトではなく、直接IDを設定\nawait repository.save(post) \u002F\u002F 余分なクエリが発生しない\n",[57,2458,2459,2467,2477,2485,2493,2497,2517,2529,2533,2545,2553,2557,2565,2576,2580,2584,2588,2603,2613,2626],{"__ignoreMap":55},[60,2460,2461,2463,2465],{"class":62,"line":63},[60,2462,91],{"class":70},[60,2464,95],{"class":94},[60,2466,131],{"class":70},[60,2468,2469,2471,2473,2475],{"class":62,"line":81},[60,2470,110],{"class":66},[60,2472,113],{"class":66},[60,2474,821],{"class":94},[60,2476,119],{"class":70},[60,2478,2479,2481,2483],{"class":62,"line":88},[60,2480,125],{"class":70},[60,2482,128],{"class":94},[60,2484,131],{"class":70},[60,2486,2487,2489,2491],{"class":62,"line":107},[60,2488,138],{"class":137},[60,2490,141],{"class":66},[60,2492,145],{"class":144},[60,2494,2495],{"class":62,"line":122},[60,2496,85],{"emptyLinePlaceholder":84},[60,2498,2499,2501,2503,2505,2507,2509,2511,2513,2515],{"class":62,"line":134},[60,2500,125],{"class":70},[60,2502,1410],{"class":94},[60,2504,1042],{"class":70},[60,2506,1045],{"class":66},[60,2508,1185],{"class":70},[60,2510,1188],{"class":137},[60,2512,1054],{"class":70},[60,2514,1045],{"class":66},[60,2516,1425],{"class":70},[60,2518,2519,2522,2524,2526],{"class":62,"line":148},[60,2520,2521],{"class":70},"    persistence: ",[60,2523,2401],{"class":144},[60,2525,1069],{"class":70},[60,2527,2528],{"class":349},"\u002F\u002F 保存時にリレーションを永続化しない\n",[60,2530,2531],{"class":62,"line":153},[60,2532,1077],{"class":70},[60,2534,2535,2537,2539,2541,2543],{"class":62,"line":163},[60,2536,125],{"class":70},[60,2538,1084],{"class":94},[60,2540,1451],{"class":70},[60,2542,1454],{"class":77},[60,2544,370],{"class":70},[60,2546,2547,2549,2551],{"class":62,"line":174},[60,2548,1200],{"class":137},[60,2550,141],{"class":66},[60,2552,1205],{"class":94},[60,2554,2555],{"class":62,"line":179},[60,2556,85],{"emptyLinePlaceholder":84},[60,2558,2559,2561,2563],{"class":62,"line":188},[60,2560,125],{"class":70},[60,2562,158],{"class":94},[60,2564,131],{"class":70},[60,2566,2567,2569,2571,2573],{"class":62,"line":198},[60,2568,1481],{"class":137},[60,2570,141],{"class":66},[60,2572,1486],{"class":144},[60,2574,2575],{"class":349}," \u002F\u002F 外部キーは直接操作\n",[60,2577,2578],{"class":62,"line":422},[60,2579,201],{"class":70},[60,2581,2582],{"class":62,"line":428},[60,2583,85],{"emptyLinePlaceholder":84},[60,2585,2586],{"class":62,"line":454},[60,2587,1881],{"class":349},[60,2589,2590,2592,2595,2597,2599,2601],{"class":62,"line":464},[60,2591,1886],{"class":66},[60,2593,2594],{"class":144}," post",[60,2596,790],{"class":66},[60,2598,1894],{"class":66},[60,2600,821],{"class":94},[60,2602,131],{"class":70},[60,2604,2605,2608,2610],{"class":62,"line":469},[60,2606,2607],{"class":70},"post.title ",[60,2609,1906],{"class":66},[60,2611,2612],{"class":77}," 'Hello'\n",[60,2614,2615,2618,2620,2623],{"class":62,"line":475},[60,2616,2617],{"class":70},"post.userId ",[60,2619,1906],{"class":66},[60,2621,2622],{"class":144}," 1",[60,2624,2625],{"class":349}," \u002F\u002F userオブジェクトではなく、直接IDを設定\n",[60,2627,2628,2630,2632,2634,2637],{"class":62,"line":494},[60,2629,1929],{"class":66},[60,2631,1932],{"class":70},[60,2633,1935],{"class":94},[60,2635,2636],{"class":70},"(post) ",[60,2638,2639],{"class":349},"\u002F\u002F 余分なクエリが発生しない\n",[10,2641,2643],{"id":2642},"constructorの定義","Constructorの定義",[15,2645,2646],{},"オブジェクトの不変条件を満たすために、必須フィールドを受け取るConstructorを定義します。",[50,2648,2650],{"className":52,"code":2649,"language":54,"meta":55,"style":55},"@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  readonly id: number\n\n  @Column()\n  name: string\n\n  @Column()\n  email: string\n\n  @Column({ default: true })\n  isActive: boolean = true\n\n  @CreateDateColumn()\n  readonly createdAt: Date\n\n  constructor(name: string, email: string) {\n    this.name = name\n    this.email = email\n  }\n}\n\n\u002F\u002F 使用例\nconst user = new User('John Doe', 'john@example.com')\nawait repository.save(user)\n",[57,2651,2652,2660,2670,2678,2689,2693,2701,2709,2713,2721,2729,2733,2745,2759,2763,2771,2781,2785,2811,2824,2836,2841,2845,2849,2853,2877],{"__ignoreMap":55},[60,2653,2654,2656,2658],{"class":62,"line":63},[60,2655,91],{"class":70},[60,2657,95],{"class":94},[60,2659,131],{"class":70},[60,2661,2662,2664,2666,2668],{"class":62,"line":81},[60,2663,110],{"class":66},[60,2665,113],{"class":66},[60,2667,116],{"class":94},[60,2669,119],{"class":70},[60,2671,2672,2674,2676],{"class":62,"line":88},[60,2673,125],{"class":70},[60,2675,128],{"class":94},[60,2677,131],{"class":70},[60,2679,2680,2682,2685,2687],{"class":62,"line":107},[60,2681,883],{"class":66},[60,2683,2684],{"class":137}," id",[60,2686,141],{"class":66},[60,2688,145],{"class":144},[60,2690,2691],{"class":62,"line":122},[60,2692,85],{"emptyLinePlaceholder":84},[60,2694,2695,2697,2699],{"class":62,"line":134},[60,2696,125],{"class":70},[60,2698,158],{"class":94},[60,2700,131],{"class":70},[60,2702,2703,2705,2707],{"class":62,"line":148},[60,2704,166],{"class":137},[60,2706,141],{"class":66},[60,2708,171],{"class":144},[60,2710,2711],{"class":62,"line":153},[60,2712,85],{"emptyLinePlaceholder":84},[60,2714,2715,2717,2719],{"class":62,"line":163},[60,2716,125],{"class":70},[60,2718,158],{"class":94},[60,2720,131],{"class":70},[60,2722,2723,2725,2727],{"class":62,"line":174},[60,2724,191],{"class":137},[60,2726,141],{"class":66},[60,2728,171],{"class":144},[60,2730,2731],{"class":62,"line":179},[60,2732,85],{"emptyLinePlaceholder":84},[60,2734,2735,2737,2739,2741,2743],{"class":62,"line":188},[60,2736,125],{"class":70},[60,2738,158],{"class":94},[60,2740,738],{"class":70},[60,2742,404],{"class":144},[60,2744,370],{"class":70},[60,2746,2747,2749,2751,2754,2756],{"class":62,"line":198},[60,2748,497],{"class":137},[60,2750,141],{"class":66},[60,2752,2753],{"class":144}," boolean",[60,2755,790],{"class":66},[60,2757,2758],{"class":144}," true\n",[60,2760,2761],{"class":62,"line":422},[60,2762,85],{"emptyLinePlaceholder":84},[60,2764,2765,2767,2769],{"class":62,"line":428},[60,2766,125],{"class":70},[60,2768,876],{"class":94},[60,2770,131],{"class":70},[60,2772,2773,2775,2777,2779],{"class":62,"line":454},[60,2774,883],{"class":66},[60,2776,886],{"class":137},[60,2778,141],{"class":66},[60,2780,573],{"class":94},[60,2782,2783],{"class":62,"line":464},[60,2784,85],{"emptyLinePlaceholder":84},[60,2786,2787,2790,2792,2795,2797,2799,2801,2804,2806,2808],{"class":62,"line":469},[60,2788,2789],{"class":66},"  constructor",[60,2791,98],{"class":70},[60,2793,2794],{"class":137},"name",[60,2796,141],{"class":66},[60,2798,714],{"class":144},[60,2800,1069],{"class":70},[60,2802,2803],{"class":137},"email",[60,2805,141],{"class":66},[60,2807,714],{"class":144},[60,2809,2810],{"class":70},") {\n",[60,2812,2813,2816,2819,2821],{"class":62,"line":475},[60,2814,2815],{"class":144},"    this",[60,2817,2818],{"class":70},".name ",[60,2820,1906],{"class":66},[60,2822,2823],{"class":70}," name\n",[60,2825,2826,2828,2831,2833],{"class":62,"line":494},[60,2827,2815],{"class":144},[60,2829,2830],{"class":70},".email ",[60,2832,1906],{"class":66},[60,2834,2835],{"class":70}," email\n",[60,2837,2838],{"class":62,"line":505},[60,2839,2840],{"class":70},"  }\n",[60,2842,2843],{"class":62,"line":510},[60,2844,201],{"class":70},[60,2846,2847],{"class":62,"line":516},[60,2848,85],{"emptyLinePlaceholder":84},[60,2850,2851],{"class":62,"line":530},[60,2852,1881],{"class":349},[60,2854,2855,2857,2859,2861,2863,2865,2867,2870,2872,2875],{"class":62,"line":540},[60,2856,1886],{"class":66},[60,2858,1889],{"class":144},[60,2860,790],{"class":66},[60,2862,1894],{"class":66},[60,2864,116],{"class":94},[60,2866,98],{"class":70},[60,2868,2869],{"class":77},"'John Doe'",[60,2871,1069],{"class":70},[60,2873,2874],{"class":77},"'john@example.com'",[60,2876,104],{"class":70},[60,2878,2879,2881,2883,2885],{"class":62,"line":545},[60,2880,1929],{"class":66},[60,2882,1932],{"class":70},[60,2884,1935],{"class":94},[60,2886,2887],{"class":70},"(user)\n",[10,2889,2891],{"id":2890},"mysqlの型対応表","MySQLの型対応表",[206,2893,2894,2907],{},[209,2895,2896],{},[212,2897,2898,2901,2904],{},[215,2899,2900],{},"TypeScript",[215,2902,2903],{},"MySQL",[215,2905,2906],{},"TypeORMの型",[222,2908,2909,2924,2938,2951,2965,2978,2992,3006,3019,3033,3048,3062],{},[212,2910,2911,2916,2919],{},[227,2912,2913],{},[57,2914,2915],{},"number",[227,2917,2918],{},"TINYINT",[227,2920,2921],{},[57,2922,2923],{},"'tinyint'",[212,2925,2926,2930,2933],{},[227,2927,2928],{},[57,2929,2915],{},[227,2931,2932],{},"SMALLINT",[227,2934,2935],{},[57,2936,2937],{},"'smallint'",[212,2939,2940,2944,2947],{},[227,2941,2942],{},[57,2943,2915],{},[227,2945,2946],{},"INT",[227,2948,2949],{},[57,2950,398],{},[212,2952,2953,2957,2960],{},[227,2954,2955],{},[57,2956,2915],{},[227,2958,2959],{},"BIGINT",[227,2961,2962],{},[57,2963,2964],{},"'bigint'",[212,2966,2967,2971,2974],{},[227,2968,2969],{},[57,2970,2915],{},[227,2972,2973],{},"DECIMAL",[227,2975,2976],{},[57,2977,437],{},[212,2979,2980,2984,2987],{},[227,2981,2982],{},[57,2983,2915],{},[227,2985,2986],{},"FLOAT",[227,2988,2989],{},[57,2990,2991],{},"'float'",[212,2993,2994,2999,3002],{},[227,2995,2996],{},[57,2997,2998],{},"string",[227,3000,3001],{},"VARCHAR",[227,3003,3004],{},[57,3005,361],{},[212,3007,3008,3012,3015],{},[227,3009,3010],{},[57,3011,2998],{},[227,3013,3014],{},"TEXT",[227,3016,3017],{},[57,3018,525],{},[212,3020,3021,3026,3029],{},[227,3022,3023],{},[57,3024,3025],{},"boolean",[227,3027,3028],{},"TINYINT(1)",[227,3030,3031],{},[57,3032,484],{},[212,3034,3035,3040,3043],{},[227,3036,3037],{},[57,3038,3039],{},"Date",[227,3041,3042],{},"DATETIME",[227,3044,3045],{},[57,3046,3047],{},"'datetime'",[212,3049,3050,3054,3057],{},[227,3051,3052],{},[57,3053,3039],{},[227,3055,3056],{},"TIMESTAMP",[227,3058,3059],{},[57,3060,3061],{},"'timestamp'",[212,3063,3064,3069,3072],{},[227,3065,3066],{},[57,3067,3068],{},"object",[227,3070,3071],{},"JSON",[227,3073,3074],{},[57,3075,596],{},[10,3077,3078],{"id":3078},"ベストプラクティス",[45,3080,3082],{"id":3081},"_1-readonlyの活用","1. readonlyの活用",[15,3084,3085,3086,3089],{},"自動生成されるフィールドや変更されないフィールドには",[57,3087,3088],{},"readonly","を付けます。",[50,3091,3093],{"className":52,"code":3092,"language":54,"meta":55,"style":55},"@Entity()\nexport class User {\n  @PrimaryGeneratedColumn()\n  readonly id: number \u002F\u002F 自動生成されるIDは変更不可\n\n  @CreateDateColumn()\n  readonly createdAt: Date \u002F\u002F 作成日時は変更不可\n}\n",[57,3094,3095,3103,3113,3121,3134,3138,3146,3159],{"__ignoreMap":55},[60,3096,3097,3099,3101],{"class":62,"line":63},[60,3098,91],{"class":70},[60,3100,95],{"class":94},[60,3102,131],{"class":70},[60,3104,3105,3107,3109,3111],{"class":62,"line":81},[60,3106,110],{"class":66},[60,3108,113],{"class":66},[60,3110,116],{"class":94},[60,3112,119],{"class":70},[60,3114,3115,3117,3119],{"class":62,"line":88},[60,3116,125],{"class":70},[60,3118,128],{"class":94},[60,3120,131],{"class":70},[60,3122,3123,3125,3127,3129,3131],{"class":62,"line":107},[60,3124,883],{"class":66},[60,3126,2684],{"class":137},[60,3128,141],{"class":66},[60,3130,1486],{"class":144},[60,3132,3133],{"class":349}," \u002F\u002F 自動生成されるIDは変更不可\n",[60,3135,3136],{"class":62,"line":122},[60,3137,85],{"emptyLinePlaceholder":84},[60,3139,3140,3142,3144],{"class":62,"line":134},[60,3141,125],{"class":70},[60,3143,876],{"class":94},[60,3145,131],{"class":70},[60,3147,3148,3150,3152,3154,3156],{"class":62,"line":148},[60,3149,883],{"class":66},[60,3151,886],{"class":137},[60,3153,141],{"class":66},[60,3155,949],{"class":94},[60,3157,3158],{"class":349}," \u002F\u002F 作成日時は変更不可\n",[60,3160,3161],{"class":62,"line":153},[60,3162,201],{"class":70},[45,3164,3166],{"id":3165},"_2-nullの明示的な初期化","2. NULLの明示的な初期化",[15,3168,3169],{},"TypeScriptの型安全性のため、NULL許容カラムには初期値を設定します。",[50,3171,3173],{"className":52,"code":3172,"language":54,"meta":55,"style":55},"@Column({ nullable: true })\nphoneNumber: string | null = null \u002F\u002F 明示的にnullで初期化\n",[57,3174,3175,3187],{"__ignoreMap":55},[60,3176,3177,3179,3181,3183,3185],{"class":62,"line":63},[60,3178,91],{"class":70},[60,3180,158],{"class":94},[60,3182,700],{"class":70},[60,3184,404],{"class":144},[60,3186,370],{"class":70},[60,3188,3189,3192,3195,3198,3200,3202,3204],{"class":62,"line":81},[60,3190,3191],{"class":94},"phoneNumber",[60,3193,3194],{"class":70},": string ",[60,3196,3197],{"class":66},"|",[60,3199,787],{"class":144},[60,3201,790],{"class":66},[60,3203,787],{"class":144},[60,3205,3206],{"class":349}," \u002F\u002F 明示的にnullで初期化\n",[45,3208,3210],{"id":3209},"_3-commentの活用","3. Commentの活用",[15,3212,3213],{},"データベースのカラムにコメントを付けることでドキュメント化できます。",[50,3215,3217],{"className":52,"code":3216,"language":54,"meta":55,"style":55},"@Column('varchar', { comment: 'ユーザーのメールアドレス' })\nemail: string\n",[57,3218,3219,3237],{"__ignoreMap":55},[60,3220,3221,3223,3225,3227,3229,3232,3235],{"class":62,"line":63},[60,3222,91],{"class":70},[60,3224,158],{"class":94},[60,3226,98],{"class":70},[60,3228,361],{"class":77},[60,3230,3231],{"class":70},", { comment: ",[60,3233,3234],{"class":77},"'ユーザーのメールアドレス'",[60,3236,370],{"class":70},[60,3238,3239,3241],{"class":62,"line":81},[60,3240,2803],{"class":94},[60,3242,3243],{"class":70},": string\n",[45,3245,3247],{"id":3246},"_4-unsigned属性mysql","4. unsigned属性（MySQL）",[15,3249,3250,3251,3254],{},"負の値を扱わない場合は",[57,3252,3253],{},"unsigned","を指定して範囲を拡大します。",[50,3256,3258],{"className":52,"code":3257,"language":54,"meta":55,"style":55},"@Column('int', { unsigned: true }) \u002F\u002F 0 〜 4,294,967,295\nprice: number\n",[57,3259,3260,3280],{"__ignoreMap":55},[60,3261,3262,3264,3266,3268,3270,3272,3274,3277],{"class":62,"line":63},[60,3263,91],{"class":70},[60,3265,158],{"class":94},[60,3267,98],{"class":70},[60,3269,398],{"class":77},[60,3271,401],{"class":70},[60,3273,404],{"class":144},[60,3275,3276],{"class":70}," }) ",[60,3278,3279],{"class":349},"\u002F\u002F 0 〜 4,294,967,295\n",[60,3281,3282,3285],{"class":62,"line":81},[60,3283,3284],{"class":94},"price",[60,3286,3287],{"class":70},": number\n",[10,3289,3290],{"id":3290},"まとめ",[15,3292,3293],{},"TypeORMのEntityを定義する際のポイントは次の通りです。",[25,3295,3296,3309,3315,3321,3327],{},[28,3297,3298,3300,3301,3304,3305,3308],{},[21,3299,217],{}," ",[57,3302,3303],{},"@Entity","、",[57,3306,3307],{},"@Column","などでカラムとリレーションを定義",[28,3310,3311,3314],{},[21,3312,3313],{},"型指定"," TypeScriptとデータベースの型を正しくマッピング",[28,3316,3317,3320],{},[21,3318,3319],{},"リレーション"," cascade、eager、onDeleteなどのオプションを理解",[28,3322,3323,3326],{},[21,3324,3325],{},"パフォーマンス"," 外部キー制約や永続化を制御",[28,3328,3329,3332],{},[21,3330,3331],{},"型安全性"," readonly、NULL初期化、Constructorで型安全なコードを実現",[15,3334,3335],{},"Entity定義により、型安全で保守性の高いデータベース操作が可能になります。",[45,3337,3338],{"id":3338},"参考リンク",[25,3340,3341,3350,3357],{},[28,3342,3343],{},[3344,3345,3349],"a",{"href":3346,"rel":3347},"https:\u002F\u002Ftypeorm.io\u002F",[3348],"nofollow","TypeORM 公式ドキュメント",[28,3351,3352],{},[3344,3353,3356],{"href":3354,"rel":3355},"https:\u002F\u002Fgithub.com\u002Ftypeorm\u002Ftypeorm\u002Fblob\u002Fmaster\u002Fdocs\u002Fdecorator-reference.md",[3348],"Decorator Reference",[28,3358,3359],{},[3344,3360,3363],{"href":3361,"rel":3362},"https:\u002F\u002Ftypeorm.io\u002Frelations",[3348],"Relations",[3365,3366,3367],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":55,"searchDepth":81,"depth":81,"links":3369},[3370,3371,3375,3380,3385,3390,3394,3395,3396,3402],{"id":12,"depth":81,"text":13},{"id":42,"depth":81,"text":43,"children":3372},[3373,3374],{"id":47,"depth":88,"text":48},{"id":204,"depth":88,"text":204},{"id":297,"depth":81,"text":297,"children":3376},[3377,3378,3379],{"id":300,"depth":88,"text":300},{"id":622,"depth":88,"text":623},{"id":799,"depth":88,"text":799},{"id":960,"depth":81,"text":960,"children":3381},[3382,3383,3384],{"id":963,"depth":88,"text":964},{"id":1212,"depth":88,"text":1213},{"id":1496,"depth":88,"text":1497},{"id":1763,"depth":81,"text":1763,"children":3386},[3387,3388,3389],{"id":1766,"depth":88,"text":1767},{"id":1944,"depth":88,"text":1945},{"id":2189,"depth":88,"text":2190},{"id":2323,"depth":81,"text":2323,"children":3391},[3392,3393],{"id":2326,"depth":88,"text":2327},{"id":2450,"depth":88,"text":2450},{"id":2642,"depth":81,"text":2643},{"id":2890,"depth":81,"text":2891},{"id":3078,"depth":81,"text":3078,"children":3397},[3398,3399,3400,3401],{"id":3081,"depth":88,"text":3082},{"id":3165,"depth":88,"text":3166},{"id":3209,"depth":88,"text":3210},{"id":3246,"depth":88,"text":3247},{"id":3290,"depth":81,"text":3290,"children":3403},[3404],{"id":3338,"depth":88,"text":3338},"2021-11-28","TypeORMでEntityを定義する方法を、基本的なデコレータからリレーション、パフォーマンス最適化まで実践的に解説します。","md",{"tags":3409},[3410,54,3411],"typeorm","database","\u002Fblog\u002Ftypeorm-entity-basics",{"title":5,"description":3406},"blog\u002Ftypeorm-entity-basics","sC0JQtf_hF2YHPrixin0P2KkfY3zUjztz25Ya0YPL8k",1773664054307]