github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/templates/main/08_relationship_one_to_one_eager.go.tpl (about) 1 {{- if or .Table.IsJoinTable .Table.IsView -}} 2 {{- else -}} 3 {{- range $rel := .Table.ToOneRelationships -}} 4 {{- $ltable := $.Aliases.Table $rel.Table -}} 5 {{- $ftable := $.Aliases.Table $rel.ForeignTable -}} 6 {{- $relAlias := $ftable.Relationship $rel.Name -}} 7 {{- $col := $ltable.Column $rel.Column -}} 8 {{- $fcol := $ftable.Column $rel.ForeignColumn -}} 9 {{- $usesPrimitives := usesPrimitives $.Tables $rel.Table $rel.Column $rel.ForeignTable $rel.ForeignColumn -}} 10 {{- $arg := printf "maybe%s" $ltable.UpSingular -}} 11 {{- $canSoftDelete := (getTable $.Tables $rel.ForeignTable).CanSoftDelete $.AutoColumns.Deleted }} 12 // Load{{$relAlias.Local}} allows an eager lookup of values, cached into the 13 // loaded structs of the objects. This is for a 1-1 relationship. 14 func ({{$ltable.DownSingular}}L) Load{{$relAlias.Local}}({{if $.NoContext}}e boil.Executor{{else}}ctx context.Context, e boil.ContextExecutor{{end}}, singular bool, {{$arg}} interface{}, mods queries.Applicator) error { 15 var slice []*{{$ltable.UpSingular}} 16 var object *{{$ltable.UpSingular}} 17 18 if singular { 19 var ok bool 20 object, ok = {{$arg}}.(*{{$ltable.UpSingular}}) 21 if !ok { 22 object = new({{$ltable.UpSingular}}) 23 ok = queries.SetFromEmbeddedStruct(&object, &{{$arg}}) 24 if !ok { 25 return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", object, {{$arg}})) 26 } 27 } 28 } else { 29 s, ok := {{$arg}}.(*[]*{{$ltable.UpSingular}}) 30 if ok { 31 slice = *s 32 } else { 33 ok = queries.SetFromEmbeddedStruct(&slice, {{$arg}}) 34 if !ok { 35 return errors.New(fmt.Sprintf("failed to set %T from embedded struct %T", slice, {{$arg}})) 36 } 37 } 38 } 39 40 args := make([]interface{}, 0, 1) 41 if singular { 42 if object.R == nil { 43 object.R = &{{$ltable.DownSingular}}R{} 44 } 45 args = append(args, object.{{$col}}) 46 } else { 47 Outer: 48 for _, obj := range slice { 49 if obj.R == nil { 50 obj.R = &{{$ltable.DownSingular}}R{} 51 } 52 53 for _, a := range args { 54 {{if $usesPrimitives -}} 55 if a == obj.{{$col}} { 56 {{else -}} 57 if queries.Equal(a, obj.{{$col}}) { 58 {{end -}} 59 continue Outer 60 } 61 } 62 63 args = append(args, obj.{{$col}}) 64 } 65 } 66 67 if len(args) == 0 { 68 return nil 69 } 70 71 query := NewQuery( 72 qm.From(`{{if $.Dialect.UseSchema}}{{$.Schema}}.{{end}}{{.ForeignTable}}`), 73 qm.WhereIn(`{{if $.Dialect.UseSchema}}{{$.Schema}}.{{end}}{{.ForeignTable}}.{{.ForeignColumn}} in ?`, args...), 74 {{if and $.AddSoftDeletes $canSoftDelete -}} 75 qmhelper.WhereIsNull(`{{if $.Dialect.UseSchema}}{{$.Schema}}.{{end}}{{.ForeignTable}}.{{or $.AutoColumns.Deleted "deleted_at"}}`), 76 {{- end}} 77 ) 78 if mods != nil { 79 mods.Apply(query) 80 } 81 82 {{if $.NoContext -}} 83 results, err := query.Query(e) 84 {{else -}} 85 results, err := query.QueryContext(ctx, e) 86 {{end -}} 87 if err != nil { 88 return errors.Wrap(err, "failed to eager load {{$ftable.UpSingular}}") 89 } 90 91 var resultSlice []*{{$ftable.UpSingular}} 92 if err = queries.Bind(results, &resultSlice); err != nil { 93 return errors.Wrap(err, "failed to bind eager loaded slice {{$ftable.UpSingular}}") 94 } 95 96 if err = results.Close(); err != nil { 97 return errors.Wrap(err, "failed to close results of eager load for {{.ForeignTable}}") 98 } 99 if err = results.Err(); err != nil { 100 return errors.Wrap(err, "error occurred during iteration of eager loaded relations for {{.ForeignTable}}") 101 } 102 103 {{if not $.NoHooks -}} 104 if len({{$ftable.DownSingular}}AfterSelectHooks) != 0 { 105 for _, obj := range resultSlice { 106 if err := obj.doAfterSelectHooks({{if $.NoContext}}e{{else}}ctx, e{{end}}); err != nil { 107 return err 108 } 109 } 110 } 111 {{- end}} 112 113 if len(resultSlice) == 0 { 114 return nil 115 } 116 117 if singular { 118 foreign := resultSlice[0] 119 object.R.{{$relAlias.Local}} = foreign 120 {{if not $.NoBackReferencing -}} 121 if foreign.R == nil { 122 foreign.R = &{{$ftable.DownSingular}}R{} 123 } 124 foreign.R.{{$relAlias.Foreign}} = object 125 {{end -}} 126 } 127 128 for _, local := range slice { 129 for _, foreign := range resultSlice { 130 {{if $usesPrimitives -}} 131 if local.{{$col}} == foreign.{{$fcol}} { 132 {{else -}} 133 if queries.Equal(local.{{$col}}, foreign.{{$fcol}}) { 134 {{end -}} 135 local.R.{{$relAlias.Local}} = foreign 136 {{if not $.NoBackReferencing -}} 137 if foreign.R == nil { 138 foreign.R = &{{$ftable.DownSingular}}R{} 139 } 140 foreign.R.{{$relAlias.Foreign}} = local 141 {{end -}} 142 break 143 } 144 } 145 } 146 147 return nil 148 } 149 {{end -}}{{/* range */}} 150 {{end}}{{/* join table */}}