PHPackages                             emsifa/laci - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. emsifa/laci

ActiveLibrary[Database &amp; ORM](/categories/database)

emsifa/laci
===========

PHP JSON flat file DBMS

v0.3.0(7y ago)18653MITPHPCI failing

Since Jan 10Pushed 5y ago2 watchersCompare

[ Source](https://github.com/emsifa/laci-db)[ Packagist](https://packagist.org/packages/emsifa/laci)[ RSS](/packages/emsifa-laci/feed)WikiDiscussions master Synced 2mo ago

READMEChangelog (1)Dependencies (1)Versions (8)Used By (0)

LaciDB - Flat File JSON DBMS
============================

[](#lacidb---flat-file-json-dbms)

[![Build Status](https://camo.githubusercontent.com/3f77e7896c843f45971690d508db24f959f9675eb1adc79fc8638c62946d6b4d/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f656d736966612f6c6163692d64622e7376673f7374796c653d666c61742d737175617265)](https://travis-ci.org/emsifa/laci-db)[![License](https://camo.githubusercontent.com/1e1cb7bae9fc55a01fc5443d26e358dc21c129253bcfa9841db85c4f25aa2ecf/687474703a2f2f696d672e736869656c64732e696f2f3a6c6963656e73652d6d69742d626c75652e7376673f7374796c653d666c61742d737175617265)](http://doge.mit-license.org)

Overview
--------

[](#overview)

LaciDB adalah flat file DBMS dengan format penyimpanan berupa JSON. Karena format JSON, LaciDB bersifat *schemaless* seperti halnya NoSQL lainnya. Sebuah record dapat memiliki kolom yang berbeda-beda.

Dalam LaciDB tidak ada istilah table, yang ada adalah collection. Collection pada LaciDB mewakili sebuah file yang menyimpan banyak records (dalam format JSON).

Nama 'Laci' sendiri diambil karena fungsi dan prosesnya seperti laci pada meja/lemari. Laci pada meja/lemari umumnya tidak membutuhkan kunci (autentikasi), cukup buka &gt; ambil sesuatu dan|atau taruh sesuatu &gt; tutup. Pada LaciDB pun seperti itu, setiap query akan membuka file &gt; eksekusi query (select|insert|update|delete) &gt; file ditutup. Laci juga seperti yang kita ketahui adalah tempat untuk menaruh barang-barang kecil. Bukan barang-barang besar seperti gudang atau lemari.

Untuk itu LaciDB bukan untuk:

- Menyimpan database dengan ukuran yang besar.
- Menyimpan database yang membutuhkan keamanan tingkat tinggi.

LaciDB dibuat untuk:

- Menangani data-data yang kecil seperti pengaturan, atau data-data kecil lain.
- Untuk kalian yang menginginkan database portable yang mudah untuk diimport/export dan backup.
- Untuk kalian yang menginginkan database yang mudah diedit sendiri tanpa menggunakan software khusus. Notepad pun bisa.

Cara Kerja
----------

[](#cara-kerja)

Cara kerja LaciDB pada dasarnya hanyalah mengalirkan array hasil `json_decode` kedalam 'pipa-pipa' yang berfungsi sebagai *filtering*, *mapping*, *sorting*, *limiting* sampai akhirnya hasilnya akan di eksekusi untuk diambil nilainya, diubah nilainya atau dibuang (baca: dihapus).

Berikut penjelasan terkait prosesnya:

### Filtering

[](#filtering)

Untuk melakukan filtering kamu dapat menggunakan method `where` dan `orWhere`. Ke2 method tersebut dapat menerima parameter `Closure` atau beberapa parameter `key, operator, value`.

### Mapping

[](#mapping)

Mapping digunakan untuk membentuk nilai yang baru pada setiap record yang telah difilter.

Berikut beberapa method untuk mapping record:

#### `map(Closure $mapper)`

[](#mapclosure-mapper)

Untuk mapping records pada collection yang telah difilter.

#### `select(array $columns)`

[](#selectarray-columns)

Mapping records untuk mengambil kolom-kolom tertentu saja.

#### `withOne(Collection|Query $relation, $key, $otherKey, $operator, $thisKey)`

[](#withonecollectionquery-relation-key-otherkey-operator-thiskey)

Untuk mengambil relasi 1:1.

#### `withMany(Collection|Query $relation, $key, $otherKey, $operator, $thisKey)`

[](#withmanycollectionquery-relation-key-otherkey-operator-thiskey)

Untuk mengambil relasi 1:n.

### Sorting

[](#sorting)

Sorting digunakan untuk mengurutkan data yang telah difilter dan dimapping. Untuk melakukan sorting kamu dapat menggunakan method `sortBy($key, $ascending)`. Parameter `$key` dapat berupa string key/kolom yang ingin diurutkan atau `Closure` jika ingin mengurutkan berdasarkan nilai yang dikomputasi terlebih dahulu.

### Limiting/Taking

[](#limitingtaking)

Setelah data selesai difilter, dimapping, dan disorting, kamu dapat memotong dan mengambil sebagian data dengan method `skip($offset)` atau `take($limit, $offset)`.

### Executing

[](#executing)

Setelah difilter, dimapping, disorting, dan disisihkan, langkah selanjutnya adalah ekseskusi hasilnya.

Berikut beberapa method untuk executing:

#### `get(array $columns = null)`

[](#getarray-columns--null)

Mengambil kumpulan records pada collection. Jika ingin mengambil kolom tertentu definisikan kolom kedalam array `$columns`.

#### `first(array $columns = null)`

[](#firstarray-columns--null)

Mengambil (sebuah) record pada collection. Jika ingin mengambil kolom tertentu definisikan kolom kedalam array `$columns`.

#### `count()`

[](#count)

Mengambil banyak data dari collection.

#### `sum($key)`

[](#sumkey)

Mengambil total key tertentu pada collection.

#### `avg($key)`

[](#avgkey)

Mengambil rata-rata key tertentu pada collection.

#### `min($key)`

[](#minkey)

Mengambil nilai terendah dari key tertentu pada collection.

#### `max($key)`

[](#maxkey)

Mengambil nilai tertinggi dari key tertentu pada collection.

#### `lists($key, $resultKey = null)`

[](#listskey-resultkey--null)

Mengumpulkan dan mengambil key tertentu kedalam array pada collection.

#### `insert(array $data)`

[](#insertarray-data)

Insert data baru kedalam collection.

#### `inserts(array $listData)`

[](#insertsarray-listdata)

Insert beberapa data baru sekaligus kedalam collection. Note: `insert` dan `inserts` tidak dapat dilakukan setelah query di filter atau di mapping.

#### `update(array $newData)`

[](#updatearray-newdata)

Mengupdate data pada records didalam collection yang difilter dan dimapping.

#### `save()`

[](#save)

Sama seperti update. Hanya saja `save` akan menyimpan record berdasarkan hasil mapping, bukan berdasarkan `$newData` seperti pada update.

#### `delete()`

[](#delete)

Menghapus data pada collection yang difilter dan dimapping.

#### `truncate()`

[](#truncate)

Menghapus seluruh data. Tidak membutuhkan filtering dan mapping terlebih dahulu.

Contoh
------

[](#contoh)

#### Inisialisasi

[](#inisialisasi)

```
use Emsifa\Laci\Collection;

require 'vendor/autoload.php';

$collection = new Collection(__DIR__.'/users.json');
```

#### Insert Data

[](#insert-data)

```
$user = $collection->insert([
    'name' => 'John Doe',
    'email' => 'johndoe@mail.com',
    'password' => password_hash('password', PASSWORD_BCRYPT)
]);
```

`$user` akan berupa array seperti ini:

```
[
    '_id' => '58745c13ad585',
    'name' => 'John Doe',
    'email' => 'johndoe@mail.com',
    'password' => '$2y$10$eMF03850wE6uII7UeujyjOU5Q2XLWz0QEZ1A9yiKPjbo3sA4qYh1m'
]
```

> '\_id' adalah `uniqid()`

#### Find Single Record By ID

[](#find-single-record-by-id)

```
$user = $collection->find('58745c13ad585');
```

#### Find One

[](#find-one)

```
$user = $collection->where('email', 'johndoe@mail.com')->first();
```

#### Select All

[](#select-all)

```
$data = $collection->all();
```

#### Update

[](#update)

```
$collection->where('email', 'johndoe@mail.com')->update([
    'name' => 'John',
    'sex' => 'male'
]);
```

> Return value is count affected records

#### Delete

[](#delete-1)

```
$collection->where('email', 'johndoe@mail.com')->delete();
```

> Return value is count affected records

#### Multiple Inserts

[](#multiple-inserts)

```
$bookCollection = new Collection('db/books.json');

$bookCollection->inserts([
    [
        'title' => 'Foobar',
        'published_at' => '2016-02-23',
        'author' => [
            'name' => 'John Doe',
            'email' => 'johndoe@mail.com'
        ],
        'star' => 3,
        'views' => 100
    ],
    [
        'title' => 'Bazqux',
        'published_at' => '2014-01-10',
        'author' => [
            'name' => 'Jane Doe',
            'email' => 'janedoe@mail.com'
        ],
        'star' => 5,
        'views' => 56
    ],
    [
        'title' => 'Lorem Ipsum',
        'published_at' => '2013-05-12',
        'author' => [
            'name' => 'Jane Doe',
            'email' => 'janedoe@mail.com'
        ],
        'star' => 4,
        'views' => 96
    ],
]);
```

#### Find Where

[](#find-where)

```
// select * from books.json where author[name] = 'Jane Doe'
$bookCollection->where('author.name', 'Jane Doe')->get();

// select * from books.json where star > 3
$bookCollection->where('star', '>', 3)->get();

// select * from books.json where star > 3 AND author[name] = 'Jane Doe'
$bookCollection->where('star', '>', 3)->where('author.name', 'Jane Doe')->get();

// select * from books.json where star > 3 OR author[name] = 'Jane Doe'
$bookCollection->where('star', '>', 3)->orWhere('author.name', 'Jane Doe')->get();

// select * from books.json where (star > 3 OR author[name] = 'Jane Doe')
$bookCollection->where(function($book) {
    return $book['star'] > 3 OR $book['author.name'] == 'Jane Doe';
})->get();
```

> Operator can be '=', '&lt;', '&lt;=', '&gt;', '&gt;=', 'in', 'not in', 'between', 'match'.

#### Mengambil Kolom/Key Tertentu

[](#mengambil-kolomkey-tertentu)

```
// select author, title from books.json where star > 3
$bookCollection->where('star', '>', 3)->get(['author.name', 'title']);
```

#### Alias Kolom/Key

[](#alias-kolomkey)

```
// select author[name] as author_name, title from books.json where star > 3
$bookCollection->where('star', '>', 3)->get(['author.name:author_name', 'title']);
```

#### Mapping

[](#mapping-1)

```
$bookCollection->map(function($row) {
    $row['score'] = $row['star'] + $row['views'];
    return $row;
})
->sortBy('score', 'desc')
->get();
```

#### Sorting

[](#sorting-1)

```
// select * from books.json order by star asc
$bookCollection->sortBy('star')->get();

// select * from books.json order by star desc
$bookCollection->sortBy('star', 'desc')->get();

// sorting calculated value
$bookCollection->sortBy(function($row) {
    return $row['star'] + $row['views'];
}, 'desc')->get();
```

#### Limit &amp; Offset

[](#limit--offset)

```
// select * from books.json offset 4
$bookCollection->skip(4)->get();

// select * from books.json limit 10 offset 4
$bookCollection->take(10, 4)->get();
```

#### Join

[](#join)

```
$userCollection = new Collection('db/users.json');
$bookCollection = new Collection('db/books.json');

// get user with 'books'
$userCollection->withMany($bookCollection, 'books', 'author.email', '=', 'email')->get();

// get books with 'user'
$bookCollection->withOne($userCollection, 'user', 'email', '=', 'author.email')->get();
```

#### Map &amp; Save

[](#map--save)

```
$bookCollection->where('star', '>', 3)->map(function($row) {
    $row['star'] = $row['star'] += 2;
    return $row;
})->save();
```

#### Transaction

[](#transaction)

```
$bookCollection->begin();

try {

    // insert, update, delete, etc
    // will stored into variable (memory)

    $bookCollection->commit(); // until this

} catch(Exception $e) {

    $bookCollection->rollback();

}
```

#### Macro Query

[](#macro-query)

Macro query memungkinkan kita menambahkan method baru kedalam instance `Emsifa\Laci\Collection` sehingga dapat kita gunakan berulang-ulang secara lebih fluent.

Sebagai contoh kita ingin mengambil data user yang aktif, jika dengan cara biasa kita dapat melakukan query seperti ini:

```
$users->where('active', 1)->get();
```

Cara seperti diatas jika digunakan berulang-ulang, terkadang kita lupa mengenali user aktif itu yang nilai `active`-nya `1`, atau `true`, atau `'yes'`, atau `'YES'`, atau `'yes'`, atau `'y'`, atau `'Y'`, atau `'Ya'`, atau `'ya'`, dsb?

Jadi untuk mempermudahnya, kita dapat menggunakan macro sebagai berikut:

```
$users->macro('active', function ($query) {
    return $query->where('active', 1);
});
```

Sehingga kita dapat mengambil user aktif dengan cara seperti ini:

```
$users->active()->get();
```

Tampak lebih praktis bukan?

###  Health Score

30

—

LowBetter than 64% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity18

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity58

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 83.3% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~84 days

Recently: every ~126 days

Total

7

Last Release

2904d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/bf2e85e5574fc28f87c28311a5ad7bcbec884e9ea21e88d63639f46ed6af72d1?d=identicon)[emsifa](/maintainers/emsifa)

---

Top Contributors

[![emsifa](https://avatars.githubusercontent.com/u/6297931?v=4)](https://github.com/emsifa "emsifa (25 commits)")[![fzn0x](https://avatars.githubusercontent.com/u/50759463?v=4)](https://github.com/fzn0x "fzn0x (5 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/emsifa-laci/health.svg)

```
[![Health](https://phpackages.com/badges/emsifa-laci/health.svg)](https://phpackages.com/packages/emsifa-laci)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90340.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
