databasepersistentballerina

Ballerina Persist with 1:N Relation


I have the following data model:

type User record {|
    readonly string id;
    string name;
    int age;
    Post[] posts;
|};

type Post record {|
    readonly string id;
    string title;
    string content;
    User author;
|};

After generating the persist client, I need to retrieve the posts for a particular user. I tried the following:

function getPosts(string id) returns db:Post[]|persist:Error? {
    db:UserWithRelations user = check dbClient->/users/id;
    return user.posts;
}

Note: db is the module generated by persist command.

But this shows the following error:

incompatible types: expected 'Post[]|ballerina/persist:1.0.0:Error)?', found 'PostOptionalized[]?'

If I change the return type of the function to db:PostOptionalized[], this error goes away.

What is the reason for this error? Is there a way to retrieve the posts without optional fields?


Solution

  • You can define a custom record type based on what you need to retrieve and set as a target type as follows,

    type UserWithPosts record {|
       db:Post[] posts; // field name should be same as you defined in the model
    |}
    
    function getPosts(string id) returns db:Post[]|persist:Error? {
        UserWithPosts user = check dbClient->/users/id;
        return user.posts;
    }