// Copyright 2019-present Facebook Inc. All rights reserved. // This source code is licensed under the Apache 2.0 license found // in the LICENSE file in the root directory of this source tree. package main import ( "context" "fmt" "log" "entgo.io/ent/examples/o2obidi/ent" "entgo.io/ent/examples/o2obidi/ent/user" _ "github.com/mattn/go-sqlite3" ) func Example_O2OBidi() { client, err := ent.Open("sqlite3", "file:ent?mode=memory&cache=shared&_fk=1") if err != nil { log.Fatalf("failed opening connection to sqlite: %v", err) } defer client.Close() ctx := context.Background() // Run the auto migration tool. if err := client.Schema.Create(ctx); err != nil { log.Fatalf("failed creating schema resources: %v", err) } if err := Do(ctx, client); err != nil { log.Fatal(err) } // Output: // a8m // nati // 2 // nati } func Do(ctx context.Context, client *ent.Client) error { a8m, err := client.User. Create(). SetAge(30). SetName("a8m"). Save(ctx) if err != nil { return fmt.Errorf("creating user: %w", err) } nati, err := client.User. Create(). SetAge(28). SetName("nati"). SetSpouse(a8m). Save(ctx) if err != nil { return fmt.Errorf("creating user: %w", err) } // Query the spouse edge. // Unlike `Only`, `OnlyX` panics if an error occurs. spouse := nati.QuerySpouse().OnlyX(ctx) fmt.Println(spouse.Name) // Output: a8m spouse = a8m.QuerySpouse().OnlyX(ctx) fmt.Println(spouse.Name) // Output: nati // Query how many users have a spouse. // Unlike `Count`, `CountX` panics if an error occurs. count := client.User. Query(). Where(user.HasSpouse()). CountX(ctx) fmt.Println(count) // Output: 2 // Get the user, that has a spouse with name="a8m". spouse = client.User. Query(). Where(user.HasSpouseWith(user.Name("a8m"))). OnlyX(ctx) fmt.Println(spouse.Name) // Output: nati return nil }