PHPackages                             minphp/record - 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. minphp/record

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

minphp/record
=============

Database Access Library

3.1.2(2y ago)01.1k↓33.3%[1 issues](https://github.com/phillipsdata/minphp-record/issues)2MITPHPPHP &gt;=5.3.0CI failing

Since Jul 3Pushed 2y ago4 watchersCompare

[ Source](https://github.com/phillipsdata/minphp-record)[ Packagist](https://packagist.org/packages/minphp/record)[ Docs](http://github.com/phillipsdata/minphp-record)[ RSS](/packages/minphp-record/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (2)Dependencies (3)Versions (13)Used By (2)

Minphp/Record
=============

[](#minphprecord)

[![Build Status](https://camo.githubusercontent.com/448bfa16357e8acf84ab3e1a3a395d566b552f0e4dcac122da9f02d0ac324026/68747470733a2f2f7472617669732d63692e6f72672f7068696c6c697073646174612f6d696e7068702d7265636f72642e7376673f62616e63683d6d6173746572)](https://travis-ci.org/phillipsdata/minphp-record) [![Coverage Status](https://camo.githubusercontent.com/c704b7d53647a8ca5d2efe2f9781bd912d3679d30aae3aeecd31388b448c5c90/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f7068696c6c697073646174612f6d696e7068702d7265636f72642f62616467652e737667)](https://coveralls.io/r/phillipsdata/minphp-record)

Database Access Library.

Provides a fluent interface for generating and executing SQL queries.

Installation
------------

[](#installation)

Install via composer:

```
composer require minphp/record:~1.0
```

Usage
-----

[](#usage)

First, initialize your connection:

```
use Minphp\Record\Record;

$dbInfo = array(
    'driver' => 'mysql',
    'host' => 'localhost',
    'database' => 'databasename',
    'user' => 'user',
    'pass' => 'pass'
);

$record = new Record($dbInfo);
```

### Select

[](#select)

Select statements must end with one of the following:

- `fetch()` fetch a single record
- `fetchAll()` fetch all records
- `getStatement()` fetch the `\PDOStatement` object which you can iterate over
- `get()` fetch the SQL query

#### All

[](#all)

```
$users = $record->select()
    ->from('users')
    ->fetchAll();
```

#### Tuples

[](#tuples)

```
$users = $record->select(array('id', 'name', 'email'))
    ->from('users')
    ->fetchAll();
```

#### Tuple Aliasing

[](#tuple-aliasing)

```
$users = $record->select(array('id', 'name', 'email' => 'login'))
    ->from('users')
    ->fetchAll();
```

#### Value Injection

[](#value-injection)

```
$users = $record->select(array('id', 'name', 'email' => 'login'))
    ->select(array('\'active\'' => 'status'), false)
    ->from('users')
    ->fetchAll();
```

#### Aggregate Functions

[](#aggregate-functions)

```
$users = $record->select(array('MAX(id)' => 'largestId'))
    ->from('users')
    ->fetch();
```

#### Number of Results

[](#number-of-results)

```
$count = $record->select()
    ->from('users')
    ->numResults();
```

#### Number of Rows Affected

[](#number-of-rows-affected)

```
$count = $record->affectedRows();
```

#### Last Insert ID

[](#last-insert-id)

```
$id = $record->lastInsertId();
```

### Limiting

[](#limiting)

Limit 10 records:

```
$users = $record->select()
    ->from('users')
    ->limit(10)
    ->fetchAll();
```

Limit 10 records, starting at record 20:

```
$users = $record->select()
    ->from('users')
    ->limit(10, 20)
    ->fetchAll();
```

### Ordering

[](#ordering)

```
$users = $record->select()
    ->from('users')
    ->order(array('id' => 'asc'))
    ->fetchAll();
```

### Grouping

[](#grouping)

```
$users = $record->select(array('email'))
    ->from('users')
    ->group(array('email'))
    ->fetchAll();
```

### Where

[](#where)

Operators include:

- `=` equality
- `!=`, `` inequality
- `>` greather than
- `>=` greather than or equal
- `from('users')
    ->where('id', '=', 10)
    ->fetchAll();
```

#### And Where

[](#and-where)

```
$users = $record->select()
    ->from('users')
    ->where('id', '=', 10)
    ->where('name', '=', 'Roger Sherman')
    ->fetchAll();
```

#### Or Where

[](#or-where)

```
$users = $record->select()
    ->from('users')
    ->where('id', '=', 10)
    ->orWhere('name', '=', 'Roger Sherman')
    ->fetchAll();
```

#### Where In

[](#where-in)

```
$users = $record->select()
    ->from('users')
    ->where('id', 'in', array(1, 2, 3, 4))
    ->fetchAll();
```

#### Simple Like

[](#simple-like)

```
$users = $record->select()
    ->from('users')
    ->like('name', 'Roger%')
    ->fetchAll();
```

#### And Like

[](#and-like)

```
$users = $record->select()
    ->from('users')
    ->like('name', 'Roger%')
    ->like('email', '@domain.com')
    ->fetchAll();
```

#### Or Like

[](#or-like)

```
$users = $record->select()
    ->from('users')
    ->like('name', 'Roger%')
    ->orLike('email', '@domain.com')
    ->fetchAll();
```

#### Simple Having

[](#simple-having)

```
$users = $record->select()
    ->from('users')
    ->having('name', '!=', null)
    ->fetchAll();
```

#### And Having

[](#and-having)

```
$users = $record->select()
    ->from('users')
    ->having('name', '!=', null)
    ->having('email', '!=', null)
    ->fetchAll();
```

#### Or Having

[](#or-having)

```
$users = $record->select()
    ->from('users')
    ->having('name', '!=', null)
    ->orHaving('email', '!=', null)
    ->fetchAll();
```

### Conditional Grouping

[](#conditional-grouping)

```
$users = $record->select()
    ->from('users')
    ->open()
        ->where('id', '>', 123)
        ->orWhere('email', '!=', null)
    ->close()
    ->where('name', '!=', null);
    ->fetchAll();
```

### Joins

[](#joins)

Each join method supports a single conditional. To add additional conditionals, simply precede the join with an `on()` call. For example `on('column1', '=', 'column2', false)`.

#### Inner Join

[](#inner-join)

```
$users = $record->select()
    ->from('users')
    ->innerJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false)
    ->fetchAll();
```

The 5th parameter to `innerJoin` tells the join that `users.user_group_id` is a field, not a value. Consider the following, instead:

```
    ->innerJoin('user_groups', 'user_groups.id', '=', 5)
```

#### Left Join

[](#left-join)

```
$users = $record->select()
    ->from('users')
    ->leftJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false)
    ->fetchAll();
```

#### Right Join

[](#right-join)

```
$users = $record->select()
    ->from('users')
    ->rightJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false)
    ->fetchAll();
```

#### Cross Join

[](#cross-join)

```
$users = $record->select()
    ->from('users')
    ->join('user_groups')
    ->fetchAll();
```

### Subqueries

[](#subqueries)

**Tip:** Avoid these at all costs. Subqueries are incredibly inefficient. This isn't a limitation of this library, rather of the underlying relational database system.

All subqueries start first with the subquery. The idea is to construct the query from the inside out, and as each layer is added the subquery becomes part of the parent query.

```
$usersQuery = $record->select()
    ->from('users')
    ->where('id', '=', 1234)->get();
$usersValues = $record->values;

$record->reset();

$groups = $record->select()
    ->from('user_groups')
    ->appendValues($usersValues)
    ->innerJoin(array($usersQuery => 'temp'), 'temp.user_group_id', '=', 'user_groups.id', false)
    ->fetchAll();

/*
SELECT * FROM user_groups
INNER JOIN (
    SELECT * FROM users
    WHERE id=1234
) AS temp ON temp.user_group_id=user_groups.id
*/
```

### Insert

[](#insert)

#### Simple Insert

[](#simple-insert)

```
$record->insert('users', array('name' => 'Roger Sherman'));
```

#### Insert with Filter

[](#insert-with-filter)

```
$record->insert(
    'users',
    array('name' => 'Roger Sherman', 'bad_field' => 'will not be inserted'),
    array('name')
);
```

#### On Duplicate

[](#on-duplicate)

```
$record->duplicate('name' => 'Roger Sherman')
    ->insert(
        'users',
        array('id' => 1776, 'name' => 'Roger Sherman')
    );
```

#### From a Query

[](#from-a-query)

```
$users = $record->select(array('id'))
    ->from('users');

$record->reset();
$record->insert('some_table', array('id' => $users));
```

### Update

[](#update)

#### Simple Update

[](#simple-update)

```
$record->where('id', '=', 1776)
    ->update('users', array('name' => 'Roger Sherman'));
```

#### Update with Filter

[](#update-with-filter)

```
$record->where('id', '=', 1776)
    ->update(
        'users',
        array('name' => 'Roger Sherman', 'bad_field' => 'will not be updated'),
        array('name')
    );
```

### Delete

[](#delete)

#### Simple Delete

[](#simple-delete)

```
$record->from('users')
    ->delete();
```

#### Multi-delete

[](#multi-delete)

```
$record->from('users')
    ->innerJoin('user_groups', 'user_groups.id', '=', 'users.user_group_id', false)
    ->where('user_groups.id', '=', 1)
    ->delete(array('users.*', 'user_groups.*'));
```

### Create Table

[](#create-table)

```
/**
* Optionally set the character set and collation of the table being created
* $record->setCharacterSet('utf8mb4');
* $record->setCollation('utf8mb4_unicode_ci');
*/
$record->setField(
        'id',
        array('type' => 'int', 'size' => 10, 'unsigned' => true, 'auto_increment' => true)
    )
    ->setField('name', array('type' => 'varchar', 'size' => '128'))
    ->setField('emai', 'array('type' => 'varchar', 'size' => '255'))
    ->setKey(array('id'), 'primary')
    ->setKey(array('name'), 'index')
    ->create('users');
```

### Alter Table

[](#alter-table)

```
$record->setKey(array('name'), 'index', null, false)
    ->alter('users');
```

The 3rd parameter to `setKey` is the name of the index. The 4th parameter identifies whether this is an add or a drop.

### Truncate

[](#truncate)

```
$record->truncate('users');
```

### Drop

[](#drop)

```
$record->drop('users');
```

### Transactions

[](#transactions)

```
try {
    $record->begin();
    $record->insert('users', array('name' => 'Roger Sherman'));
    $record->commit();
} catch (\PDOException $e) {
    $record->rollBack();
}
```

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity17

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity65

Established project with proven stability

 Bus Factor1

Top contributor holds 54.2% 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 ~288 days

Recently: every ~221 days

Total

11

Last Release

1088d ago

Major Versions

1.0.0 → 2.0.02015-11-30

2.1.x-dev → 3.0.x-dev2020-12-22

### Community

Maintainers

![](https://www.gravatar.com/avatar/7f87ae869d67f48673504d6cba1adcb8945a3ba8280798917e18b7c744009fc2?d=identicon)[clphillips](/maintainers/clphillips)

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

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

---

Top Contributors

[![JReissmueller](https://avatars.githubusercontent.com/u/18198499?v=4)](https://github.com/JReissmueller "JReissmueller (13 commits)")[![clphillips](https://avatars.githubusercontent.com/u/682986?v=4)](https://github.com/clphillips "clphillips (6 commits)")[![abdyfranco](https://avatars.githubusercontent.com/u/23648083?v=4)](https://github.com/abdyfranco "abdyfranco (3 commits)")[![tysonphillips](https://avatars.githubusercontent.com/u/8607630?v=4)](https://github.com/tysonphillips "tysonphillips (2 commits)")

###  Code Quality

TestsPHPUnit

Code StylePHP\_CodeSniffer

### Embed Badge

![Health badge](/badges/minphp-record/health.svg)

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

###  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)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

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

Reliese Components for Laravel Framework code generation.

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

Laravel Userstamps provides an Eloquent trait which automatically maintains `created\_by` and `updated\_by` columns on your model, populated by the currently authenticated user in your application.

7511.7M13](/packages/wildside-userstamps)

PHPackages © 2026

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