Models
Attributes
Defining Attributes
Whenever you create a model, its attributes need to be specified in the model definition.
// post.ts
import {Model} from "@tailflow/laravel-orion/lib/model";
export class Post extends Model<{
title: string,
body: string
}>
{
}
Accessing Attributes
Once model is retrieved from the API, its attributes are available via the $attributes
property on the model object.
const post = await Post.$query().find(5);
console.log(post.$attributes.title);
console.log(post.$attributes.body);
Persisted Attributes
Along with attributes you can also define a so called "persisted attributes". Those attributes are not available on a model at the time of its creation, but they become available only after it is stored in the database, processed, and returned by the API.
Default persisted attributes are id
, created_at
, updated_at
, and deleted_at
, but you can specify different ones by overriding the second generic parameter in model definition.
// post.ts
import {Model} from "@tailflow/laravel-orion/lib/model";
export class Post extends Model<{
title: string,
body: string
}, {
id: number,
thumbnail_url: string
}>
{
}
Soft Deletes
If a model is soft deletable, you may want to use DefaultSoftDeletablePersistedAttributes
type. This type simply adds deleted_at
attribute along other default persisted attributes.
Resource Name
If you have an API resource under /api/posts
, then posts
is the name of the
resource that you need to specify on a model.
// post.ts
import {Model} from "@tailflow/laravel-orion/lib/model";
export class Post extends Model<{
title: string,
body: string
}>
{
public $resource(): string {
return 'posts';
}
}
Primary Key
Getting and Setting Primary Key Value
const post = await Post.$query().find(5);
post.$setKey(4);
console.log(post.$getKey());
console.log(post.$attributes.id);
Customizing Primary Key
By default, the id
attribute is considered model's primary key. However, it is possible to specify a different attribute to use as a primary key.
// post.ts
import {Model} from "@tailflow/laravel-orion/lib/model";
export class Post extends Model<{
slug: string,
title: string,
body: string,
}>
{
protected $keyName: string = 'slug';
}
Customizing Primary Key Type
By default, the type of primary key is number | string
. If primary key is a string
or you would like to be more explicit, simply override the fourth generci parameter in model definition.
// post.ts
import {Model} from "@tailflow/laravel-orion/lib/model";
export class Post extends Model<{
slug: string,
title: string,
body: string,
}, {}, {}, string>
{
protected $keyName: string = 'slug';
}
Operations
Retrieving a List of Resources
const posts = await Post.$query().get();
Searching for Resources
Keyword-based Search
const posts = await Post.$query().lookFor('some value').search();
Scopes
const posts = await Post.$query().scope('published', [Date.now()]).search();
Filters
const posts = await Post.$query().filter('meta.source_id', FilterOperator.Equal, 'test-source').search();
Sorting
const posts = await Post.$query().sortBy('published_at', SortDirection.Desc).search();
const posts = await Post.$query()
.lookFor('some value')
.scope('published', [Date.now()])
.sortBy('published_at', SortDirection.Desc)
.search();
Creating a Resource
const newPost = await Post.$query().store({
title: 'New post'
});
Retrieving a Resource
const post = await Post.$query().find(5);
Updating a Resource
let post = await Post.$query().find(5);
post.$attributes.title = 'Updated post';
await post.$save();
// or
await post.$save({title: 'Updated post'});
//or
const updatedPost = await Post.$query().update(5, {
title: 'Updated title'
});
Deleting a Resource
const deletedPost = await Post.$query().delete(5);
// or
await post.$destroy();
Force Deleting
To force delete a resource, provide a second argument to the delete method.
const deletedPost = await Post.$query().delete(5, true);
// or
await post.$destroy(true);