JCC Express

JCC Eloquent ORM

Relationships

Introduction

JCC-Eloquent supports standard relationship methods directly on model classes.

Define relationships as instance methods returning relation builders.


Available relationship methods

From Model:

  • hasOne(related, foreignKey?, localKey?)
  • hasMany(related, foreignKey?, localKey?)
  • belongsTo(related, foreignKey?, ownerKey?)
  • belongsToMany(related, pivotTable?, foreignPivotKey?, relatedPivotKey?, parentKey?, relatedKey?)
  • morphOne(related, morphName, type?)
  • morphMany(related, morphName, type?)
  • morphTo(morphName?)

One-to-many example

TypeScript
export class User extends Model {
  posts() {
    return this.hasMany(Post, "author");
  }
}

Belongs-to example

TypeScript
export class Post extends Model {
  user() {
    return this.belongsTo(User, "author");
  }
}

Many-to-many example

TypeScript
export class User extends Model {
  roles() {
    return this.belongsToMany(Role, "user_role", "user_id", "role_id");
  }
}

If omitted, pivot table/key names are inferred from model names.


Polymorphic examples

TypeScript
export class Image extends Model {
  imageable() {
    return this.morphTo("imageable");
  }
}

export class Post extends Model {
  images() {
    return this.morphMany(Image, "imageable");
  }
}

Relationship query helpers

Static model methods:

  • has(relation, operator?, count?, boolean?, callback?)
  • whereHas(relation, callback?, operator?, count?)
  • orWhereHas(relation, callback?, operator?, count?)

Example:

TypeScript
const usersWithPosts = await User.whereHas("posts").get();

Eager loading

Use with(...) to preload relations:

TypeScript
const users = await User.with(["posts", "roles"]).get();

with also accepts object/callback style for constrained eager loading.


Summary

  • Define relations as model methods using hasOne/hasMany/belongsTo/belongsToMany/morph*.
  • Use with(...) for eager loading.
  • Use whereHas(...) when filtering by related data.