Skip to content
Clone of Laravel's Eloquent ORM for nodejs
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.
modules Better adapter loading Nov 11, 2016
tests Add migrations cli generator Nov 11, 2016
.babelrc first push Nov 1, 2016
.env Added tests, added inserts Nov 2, 2016
.gitignore Add migration / model cli commands Nov 8, 2016
.npmignore Add migration / model cli commands Nov 8, 2016 ... Mar 24, 2017
circle.yml Fix circle import Nov 7, 2016
package.json Slight mysql cleanup Nov 10, 2016

CircleCI Coverage Status



  • more drivers
  • migrations support
  • more cli tools

Relation takes inspiration from knex and sequelize, but the end goal to to completely mimick Laravel's Eloquent package. In order to achieve the best syntax possible, we are using ES6 Proxies, which is now supported in the latest version of node. Currently, only mysql is supported, but adding a new driver is trivial.

Why this over xyz?

Read this wiki page for why this is better than knex and sequelize. The gist is this: syntax, and lazy loading relationships.

npm install relation --save

//if using mysql driver
npm install mysql --save


You must set the following environment variables in your app. We recommend creating a .env file and using dotenv


Create a Model


import { Model } from 'relation'

export default class Chat extends Model {

  overwrite table name, this function is optional

  static tableName() {
    return 'dashboard_chats'

Using the Model

As long as the plural version of the model is available in the database (you can overwrite this), you can query the database.

import Chat from './chat'

async function getChats {
  let chats = await Chat.all()

Supported methods

  • .all() returns everything in the table
  • .where({ fieldName: 'value' }) returns any matching results
  • .create({ field: 'value'}) create a new row
  • .select('column', 'column2') contrain rows to select
  • .first() returns first results
  • .limit(5) limits the query

Query Building'messages', 'id').where({ messages: 'blah' }).get()

Chat.where({ messages: 'blah' }).get()'messages').first()

Chat.where({ messages: 'blah' }).limit(2).get()


This is a huge WIP, feel free to contribute :)


  • One To One
  • One To Many


  • Many To Many
  • Has Many Through
  • Polymorphic Relations
  • Many To Many Polymorphic Relations

One to One Example

import { Model } from 'relation'

export default class User extends Model {


export default class Chat extends Model {
  user() {
    return this.hasOne(User)

let chat = await Chat.first()

//any relationship will return a promise with the result
let user = await chat.user


One to Many Example

import { Model } from 'relation'

export default class User extends Model {
  chats() {
    return this.hasMany(Chat)

export default class Chat extends Model {


let user = await User.first()

//has many results return a query builder instance
let chats = await user.chats.first()


Will go over this soon...


If you install relation globally (npm install relation -g) you can access the CLI methods to help create migrations, models, etc.


relation make:migration User -m -m will create a model as well

This will create a migration file that will allow you to build out tables.


relation make:model User

Creates a file in your current directory /models/user.js with a default model

You can’t perform that action at this time.