v0.3 GitHub

Eloquent compatibility

What maps to Laravel, what does not

Status key: Have = present. Partial = present with gaps. Missing = not implemented. n/a = the problem does not arise in this ORM, or Rust covers it another way.

Checked against the code on 2026-10-11, after the parity pass that closed the gaps of the first version of this report.

Relations

EloquentHereStatus
hasOne, hasMany, belongsTo, belongsToMany, morphOne/Many/To#[rustique(...)] attributesHave
hasManyThrough, hasOneThroughhas_many_through, has_one_throughHave
morphToMany / morphedByManymorph_to_many, morphed_by_many, with the full pivot APIHave
withCount, withSum, withAvg, withMin, withMax, withExistswith_count(_where), with_sum, with_avg, with_min, with_max, with_exists(_where) into #[rustique(count)] / #[rustique(aggregate)] fieldsHave; each with a _where closure variant and "relation as alias" naming
eager-load constraints, with('posts' => fn)with_where, or with_typed(User::POSTS, ...) with the related model’s scopesHave; limit / offset apply per parent (ROW_NUMBER() OVER); typed form for single relations only
with('posts:id,title')with("posts:id,title")Have
where on a relation definitionscope = fn in the relation attributeHave
latestOfMany, oldestOfMany, ofManylatest_of_many [= "column"], oldest_of_many, of_many(col = "max", ...) on has_one / morph_oneHave; single-column keys
pivot extra columns, withPivot, pivot timestampspivot = [...], pivot_timestamps, attach_with, update_existingHave
sync, syncWithoutDetaching, togglesync, sync_without_detaching, toggle, attach, detachHave
whereHas / withCount on self-relationsinner table aliased orm_selfHave
whereHasMorph / whereDoesntHaveMorphwhere_has_morph, where_doesnt_have_morphHave
morphWithCountwith_morph_countHave
withCount on morphTo itselfrejected, as in Eloquentn/a

Models

EloquentHereStatus
fillable / guarded{Model}Fill, #[rustique(fillable)]; guarded by defaultHave
accessors / mutatorsplain methods, cast newtypesn/a
hidden / visible / appends#[serde(skip_serializing)], custom Serializen/a; no runtime makeHidden
toArray / toJsonserde SerializeHave
casts#[derive(rustique::Cast)]Have
custom timestamp columnscreated_at = "..." etc.Have
app.timezonerustique::set_timezone, rustique::now, DbBuilder::timezoneHave; set_timezone is process-wide, DbBuilder::timezone sets the session time zone
partial selects (select('id', 'name'))missing columns take DefaultHave
touch, replicate, refresh, freshsame namesHave
UUID / ULID keys#[rustique::model(uuid)] / ulid (UUID v7, lowercase ULID)Have
global scopesGlobalScope, without_global_scope(s)Have
model pruningPrunable (prune, mass_prune, pruning hook)Have; no model:prune command
preventLazyLoadingprevent_lazy_loadingHave

Query builder

EloquentHereStatus
where family, joins, unions, subqueries, when, fromSub, joinSub / leftJoinSub, groupByRawall present (from_sub, join_sub, left_join_sub, group_by_raw)Have
aggregates, pluck, valuecount, sum, avg, min, max, pluck, pluck_keyed, valueHave
whereIntegerInRawautomatic for IN lists over 1000 integersHave
increment, decrementbuilder, Query and modelHave
firstOrNew, firstOrCreate, updateOrCreate, createOrFirstsame namesHave
chunk, chunkById, lazy, lazyById, cursorchunk, chunk_by_id, cursorHave
paginate, simplePaginate, cursorPaginatesame namesHave
sole, find, findMany, whereKeysole, find, find_many, where_key, where_keysHave; sole on model queries only
lockslock_for_update, shared_lock, skip_locked, plus lock_for_update_no_wait, lock_for_update_waitHave; wait on Oracle only
insertUsinginsert_usingHave

Transactions and database

EloquentHereStatus
nested transactions via savepointstx.transaction(...)Have
deadlock retrytransaction_with_retriesHave
read / write connection splitDbBuilder::read_url, Db::write, DbBuilder::stickyHave; sticky needs a Db::sticky_scope per request
query loggingtracing, target rustique::queryHave

Schema and migrations

EloquentHereStatus
Schema builder, rename, drop, dropAllTablespresentHave
change columnchange()Have
migrate, rollback, rollback —step, reset, fresh, statusMigrator and the CLIHave; no squash
migration lock against concurrent runsGET_LOCK / lock tableHave
useCurrent, raw defaults, column and table commentsuse_current, default_raw, commentHave; use_current_on_update acts on MySQL only
time columnsnone (Oracle has no TIME)Missing

Other

EloquentHereStatus
events and observersHooks and ObserverHave
hooks on bulk queriesnot fired, as in EloquentHave
factoriesHasFactory, FactoryHave; no Faker
seedersMigrator::seeder, db:seed, --seedHave
lazy collectionscursor streams modelsHave