.Relate()
Creates a relation between records.
Method Syntax
surrealdb.Relate(db, relationship)
Arguments
| Arguments | Description |
|---|
thing required | The table name or a RecordId to create. |
@in required | The edge of the relation. |
@out required | The other edge of the relation. |
data optional | The document / record data to insert. |
Example usage
package main
import (
"fmt"
"time"
surrealdb "github.com/surrealdb/surrealdb.go"
"github.com/surrealdb/surrealdb.go/pkg/models"
)
func ExampleRelate() {
db, err := surrealdb.New("ws://localhost:8000")
if err != nil {
panic(err)
}
if err = db.Use("test", "test"); err != nil {
panic(err)
}
token, err := db.SignIn(&surrealdb.Auth{
Username: "root",
Password: "root",
})
if err != nil {
panic(err)
}
if err = db.Authenticate(token); err != nil {
panic(err)
}
type Person struct {
ID models.RecordID `json:"id,omitempty"`
}
type Follow struct {
In *models.RecordID `json:"in,omitempty"`
Out *models.RecordID `json:"out,omitempty"`
Since models.CustomDateTime `json:"since"`
}
first, err := surrealdb.Create[Person](
db,
"person",
map[string]any{
"id": models.NewRecordID("person", "first"),
})
if err != nil {
panic(err)
}
second, err := surrealdb.Create[Person](
db,
"person",
map[string]any{
"id": models.NewRecordID("person", "second"),
})
if err != nil {
panic(err)
}
since, err := time.Parse(time.RFC3339, "2023-10-01T12:00:00Z")
if err != nil {
panic(err)
}
persons, err := surrealdb.Query[[]Person](
db,
"SELECT * FROM person ORDER BY id.id",
nil,
)
if err != nil {
panic(err)
}
for _, person := range (*persons)[0].Result {
fmt.Printf("Person: %+v\n", person)
}
if relateErr := surrealdb.Relate(
db,
&surrealdb.Relationship{
ID: &models.RecordID{Table: "follow", ID: "first_second"},
In: first.ID,
Out: second.ID,
Relation: "follow",
Data: map[string]any{
"since": models.CustomDateTime{
Time: since,
},
},
},
); relateErr != nil {
panic(relateErr)
}
type PersonWithFollows struct {
Person
Follows []models.RecordID `json:"follows,omitempty"`
}
selected, err := surrealdb.Query[[]PersonWithFollows](
db,
"SELECT id, name, ->follow->person AS follows FROM $id",
map[string]any{
"id": first.ID,
},
)
if err != nil {
panic(err)
}
for _, person := range (*selected)[0].Result {
fmt.Printf("PersonWithFollows: %+v\n", person)
}
follows, err := surrealdb.Query[[]Follow](
db,
"SELECT * from follow",
nil,
)
if err != nil {
panic(err)
}
for _, follow := range (*follows)[0].Result {
fmt.Printf("Follow: %+v\n", follow)
}
}