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 */}}