Casts


Defining Casts

Attribute casting provides functionality similar to accessors and mutators without requiring you to define any additional methods on your model.

Supported casts are:

  • StringCast
  • NumberCast
  • BooleanCast
  • ArrayCast

via casts method

import { StringCast } from 'pinia-orm/casts'class User extends Model {  static entity = 'users'  static fields () {    return {      id: this.attr(null),      firstName: this.string(''),      lastName: this.string('')    }  }    static casts () {      return {          firstName: StringCast,          lastName: StringCast,      }  }}const user = useRepo(User).save({  firstName: 'John',  lastName: 1234})console.log(user.lastName) // '1234'

via decorator

import { ArrayCast } from 'pinia-orm/casts'class User extends Model {  static entity = 'users'  @Cast(() => ArrayCast)  @Attr('{}') declare meta: Record<string, any>}console.log(new User({ meta: '{"name":"John", "age":30, "car":null}' }).meta)// { name: 'John', age: 30, car: null }

If you like decorators you can also use the Cast decorator to apply a cast to an value

Defining Custom Casts

Pina ORM gives you also the possibility to define your own cast and use them.

via casts method

class CustomCast extends CastAttribute {  get(value?: any): any {    return typeof value === 'string' ? `string ${value}` : value  }  set(value?: any): any {    return this.get(value)  }}class User extends Model {  static entity = 'users'  @Attr('{}') declare name: string  static casts() {    return {      name: CustomCast,    }  }}console.log(new User({ name: 'John' }).name) // 'string John'

via decorator

class CustomCast extends CastAttribute {  get(value?: any): any {    return typeof value === 'string' ? `string ${value}` : value  }  set(value?: any): any {    return this.get(value)  }}class User extends Model {  static entity = 'users'  @Cast(() => CustomCast) @Attr('test') declare name: string}console.log(new User({ name: 'John' }).name) // 'string John'

with parameters

Yon can also define casts where you pass custom parameters to change the behaviour

class CustomCast extends CastAttribute {  static parameters = {    type: 'string',  }  get(value?: any): any {    const type = this.getParameters().type    return typeof value === type ? `${type} ${value}` : value  }  set(value?: any): any {    return this.get(value)  }}class User extends Model {  static entity = 'users'  @Attr('{}') declare name: string  static casts() {    return {      name: CustomCast.withParameters({ type: 'number' }),    }  }}console.log(new User({ name: 'John' }).name) // 'John'console.log(new User({ name: 1 }).name) // 'number 1'