adonis-lucid-polymorphic

Adonis Lucid ^4.1.0 Polymorphic Relations Support.

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
adonis-lucid-polymorphic
2491.0.14 years ago5 years agoMinified + gzip package size for adonis-lucid-polymorphic in KB

Readme

Adonis Lucid Polymorphic
Build Status Coverage Status
Polymorphic Relations support for Adonis Lucid ^4.1.0.

Installation

  1. Add package:

$ npm i adonis-lucid-polymorphic --save
or
$ yarn add adonis-lucid-polymorphic

  1. Register providers inside the your bootstrap/app.js file.

const providers = [
  ...
  'adonis-lucid-polymorphic/providers/PolymorphicProvider',
  ...
]

Examples

Table Structure

posts
    id - integer
    title - string
    body - text

videos
    id - integer
    title - string
    url - string

comments
    id - integer
    body - text
    commentable_id - integer
    commentable_type - string

Model Structure

// App/Model/Post
'use strict'

const Model = use('Lucid')

class Post extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  comments () {
    return this.morphMany('App/Models/Comment', 'id', 'commentable_id', 'commentable_type')
  }
}

module.exports = Post

// App/Model/Video
'use strict'

const Model = use('Lucid')

class Video extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  comments () {
    return this.morphMany('App/Models/Comment', 'id', 'commentable_id', 'commentable_type')
  }
}

module.exports = Video

// App/Model/Comment
'use strict'

const Model = use('Lucid')

class Comment extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  commentable () {
    return this.morphTo([
      'App/Models/Post', 'App/Models/Video'
    ], 'id', 'id', 'commentable_id', 'commentable_type')
  }
}

module.exports = Video

API

morphTo(relatedModels, primaryKey, relatedPrimaryKey, morphIdKey, morphTypeKey)

...

class Comment extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  commentable () {
    return this.morphTo([
      'App/Models/Post', 'App/Models/Video'
    ], 'id', 'id', 'commentable_id', 'commentable_type')
  }
}

...

morphMany(relatedModel, primaryKey, morphIdKey, morphTypeKey)

...

class Post extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  comments () {
    return this.morphMany('App/Models/Comment', 'id', 'commentable_id', 'commentable_type')
  }
}

...

morphOne(relatedModel, primaryKey, morphIdKey, morphTypeKey)

...

class Publication extends Model {
  static get traits () {
    return ['@provider:Morphable']
  }

  content () {
    return this.morphOne('App/Models/Content', 'id', 'contentable_id', 'contentable_type')
  }
}

...

Credits

Support

Having trouble? Open an issue!

License

The MIT License (MIT). Please see License File for more information.