PHP code example of utopia-php / database

1. Go to this page and download the library: Download utopia-php/database library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

utopia-php / database example snippets




use PDO;
use Utopia\Database\Database;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Memory;
use Utopia\Database\Adapter\MariaDB;

$dbHost = 'mariadb';
$dbPort = '3306';
$dbUser = 'root';
$dbPass = 'password';
$pdoConfig = [
    PDO::ATTR_TIMEOUT => 3, // Seconds
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => true,
    PDO::ATTR_STRINGIFY_FETCHES => true,
];

$pdo = new PDO("mysql:host={$dbHost};port={$dbPort};charset=utf8mb4", $dbUser, $dbPass, $pdoConfig);

$cache = new Cache(new Memory()); // or use any cache adapter you wish

$database = new Database(new MariaDB($pdo), $cache);



use PDO;
use Utopia\Database\Database;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Memory;
use Utopia\Database\Adapter\MySQL;

$dbHost = 'mysql';
$dbPort = '3306';
$dbUser = 'root';
$dbPass = 'password';
$pdoConfig = [
    PDO::ATTR_TIMEOUT => 3, // Seconds
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => true,
    PDO::ATTR_STRINGIFY_FETCHES => true,
];

$pdo = new PDO("mysql:host={$dbHost};port={$dbPort};charset=utf8mb4", $dbUser, $dbPass, $pdoConfig);

$cache = new Cache(new Memory()); // or use any cache adapter you wish

$database = new Database(new MySql($pdo), $cache);



use PDO;
use Utopia\Database\Database;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Memory;
use Utopia\Database\Adapter\Postgres;

$dbHost = 'postgres';
$dbPort = '5432';
$dbUser = 'root';
$dbPass = 'password';
$pdoConfig = [
    PDO::ATTR_TIMEOUT => 3, // Seconds
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => true,
    PDO::ATTR_STRINGIFY_FETCHES => true,
];

$pdo = new PDO("pgsql:host={$dbHost};port={$dbPort};charset=utf8mb4", $dbUser, $dbPass, $pdoConfig);

$cache = new Cache(new Memory()); // or use any cache adapter you wish

$database = new Database(new Postgres($pdo), $cache);



use PDO;
use Utopia\Database\Database;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Memory;
use Utopia\Database\Adapter\SQLite;

$dbPath = '/path/to/database.sqlite';
$pdoConfig = [
    PDO::ATTR_TIMEOUT => 3, // Seconds
    PDO::ATTR_PERSISTENT => true,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => true,
    PDO::ATTR_STRINGIFY_FETCHES => true,
];

$pdo = new PDO("{$dbPath}", $pdoConfig);

$cache = new Cache(new Memory()); // or use any cache adapter you wish

$database = new Database(new SQLite($pdo), $cache);



use Utopia\Database\Database;
use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Memory;
use Utopia\Database\Adapter\Mongo;
use Utopia\Mongo\Client; // from utopia-php/mongo

$dbHost = 'mongo';
$dbPort = 27017; 
$dbUser = 'root';
$dbPass = 'password';
$dbName = 'dbName';

$mongoClient = new Client($dbName, $dbHost, $dbPort, $dbUser, $dbPass, true);

$cache = new Cache(new Memory()); // or use any cache adapter you wish

$database = new Database(new Mongo($client), $cache);


// Get namespace
$database->getNamespace();

// Sets namespace that prefixes all collection names
$database->setNamespace(
    namespace: 'namespace'
);

// Get default database
$database->getDatabase();

// Sets default database
$database->setDatabase(
    name: 'dbName'
);

// Creates a new database. 
// Uses default database as the name.
$database->create();

// Returns an array of all databases
$database->list();

// Delete database
$database->delete(
    name: 'mydb'
);

// Ping database it returns true if the database is alive
$database->ping();

// Check if database exists
$database->exists(
    database: 'mydb'
); 

// Check if collection exists
$database->exists(
    database: 'mydb',
    collection: 'users'
); 

// Listen to events

// Event Types
Database::EVENT_ALL
Database::EVENT_DATABASE_CREATE,
Database::EVENT_DATABASE_LIST,
Database::EVENT_COLLECTION_CREATE,
Database::EVENT_COLLECTION_LIST,
Database::EVENT_COLLECTION_READ,
Database::EVENT_ATTRIBUTE_CREATE,
Database::EVENT_ATTRIBUTE_UPDATE,
Database::EVENT_INDEX_CREATE,
Database::EVENT_DOCUMENT_CREATE,
Database::EVENT_DOCUMENT_UPDATE,
Database::EVENT_DOCUMENT_READ,
Database::EVENT_DOCUMENT_FIND,
Database::EVENT_DOCUMENT_FIND,
Database::EVENT_DOCUMENT_COUNT,
Database::EVENT_DOCUMENT_SUM,
Database::EVENT_DOCUMENT_INCREASE,
Database::EVENT_DOCUMENT_DECREASE,
Database::EVENT_INDEX_DELETE,
Database::EVENT_DOCUMENT_DELETE,
Database::EVENT_ATTRIBUTE_DELETE,
Database::EVENT_COLLECTION_DELETE,
Database::EVENT_DATABASE_DELETE,

$database->on(
    Database::EVENT_ALL, 
    function($event, $data) {
        // Do something
    }
);

// Get Database Adapter
$database->getAdapter();

// Get List of keywords that cannot be used
$database->getKeywords();

// Creates two new collection named '$namespace_$collectionName' with attribute names '_id', '_uid', '_createdAt', '_updatedAt', '_permissions' 
// The second collection is named '$namespace_$collectionName_perms' with attribute names '_id', '_type', '_permission', '_document'
$database->createCollection(
    name: 'users'
);

// Create collection with attributes and indexes
$attributes = [
     new Document([
         '$id' => ID::unique(),
         '$permissions' => [
            Permission::read(Role::any()),
            Permission::update(Role::any()),
            Permission::delete(Role::any())
         ],
         'name' => 'Jhon', 
         'age'  =>  20
     ]),
     new Document([
         '$id' => ID::unique(),
         '$permissions' => [
            Permission::read(Role::any()),
            Permission::update(Role::any()),
            Permission::delete(Role::any())
         ],
         'name' => 'Doe', 
         'age'  =>  34
     ]),
]

$indexes = [
     new Document([
            '$id' => ID::unique(),
            'type' => Database::INDEX_KEY,
            'attributes' => ['name'],
            'lengths' => [256],
            'orders' => ['ASC'],
        ]),
     new Document([
            '$id' => ID::unique(),
            'type' => Database::INDEX_KEY,
            'attributes' => ['name', 'age'],
            'lengths' => [128, 128],
            'orders' => ['ASC'],
        ])
];

$database->createCollection(
    name: 'users', 
    attributes: $attributes, 
    indexes: $indexes
);

// Update Collection Permissions
$database->updateCollection(
    id: 'users',
    permissions: [
        Permission::read(Role::any()),
        Permission::update(Role::any()),
        Permission::delete(Role::any())
    ],
    documentSecurity: true
);

// Get Collection
$database->getCollection(
    id: 'users'
);

// List Collections
$database->listCollections(
    limit: 25, 
    offset: 0
);

// Deletes the two collections named 'namespace_$collectionName' and 'namespace_$collectionName_perms'
$database->deleteCollection(
    id: 'users'
);

// Delete cached documents of a collection
$database->purgeCachedCollection(
    collection: 'users'
);

// Data types
Database::VAR_STRING      
Database::VAR_INTEGER
Database::VAR_FLOAT
Database::VAR_BOOLEAN  
Database::VAR_DATETIME


// Creates a new attribute named '$attributeName' in the '$namespace_$collectionName' collection.
$database->createAttribute(
    collection: 'movies',
    id: 'name',
    type:  Database::VAR_STRING,
    size: 128, 
    Name' in the '$namespace_$collectionName' collection.
$database-> updateAttribute(
    collection: 'movies', 
    id: 'genres',
    type: Database::VAR_STRING, 
    size: 128, 
    ormatOptions: []
);

// Update the attribute filters
$database->updateAttributeFilters(
    collection: 'movies', 
    id: 'genres',
    filters: []
);

// Update the default value of an attribute
$database->updateAttributeDefault(
    collection: 'movies', 
    id: 'genres',
    default: 'sci-fi'
);

// Check if attribute can be added to a collection
$collection = $database->getCollection('movies');

$attribute = new Document([
    '$id' => ID::unique(),
    'type' => Database::VAR_INTEGER,
    'size' => 256,
    '

// Index types
Database::INDEX_KEY,                 
Database::INDEX_FULLTEXT
Database::INDEX_UNIQUE
Database::INDEX_SPATIAL
Database::INDEX_ARRAY

// Insertion Order                                 
Database::ORDER_ASC
Database::ORDER_DESC
   

// Creates a new index named '$indexName' in the '$namespace_$collectionName' collection.
// Note: The size for the index will be taken from the size of the attribute
$database->createIndex(
    collection: 'movies', 
    id: 'index1', Database::INDEX_KEY, 
    attributes: ['name', 'genres'], 
    lengths: [128,128], 
    orders: [Database::ORDER_ASC, Database::ORDER_DESC]
);

// Rename index from old to new in the '$namespace_$collectionName' collection.
$database->renameIndex(
    collection: 'movies', 
    old: 'index1', 
    new: 'index2'
);

// Deletes the index in the '$namespace_$collectionName' collection.
$database->deleteIndex(
    collection: 'movies', 
    id: 'index2'
);

// Relationship types
Database::RELATION_ONE_TO_ONE
Database::RELATION_ONE_TO_MANY
Database::RELATION_MANY_TO_ONE
Database::RELATION_MANY_TO_MANY

// Creates a relationship between the two collections with the default reference attributes
$database->createRelationship(
    collection: 'movies', 
    relatedCollection: 'users', 
    type: Database::RELATION_ONE_TO_ONE,
    twoWay: true
);


// Create a relationship with custom reference attributes
$database->createRelationship(
    collection: 'movies', 
    relatedCollection: 'users', 
    type: Database::RELATION_ONE_TO_ONE, 
    twoWay: true, 
    id: 'movies_id', 
    twoWayKey: 'users_id'
); 

// Relationship onDelete types
Database::RELATION_MUTATE_CASCADE, 
Database::RELATION_MUTATE_SET_NULL,
Database::RELATION_MUTATE_RESTRICT,

// Update the relationship with the default reference attributes
$database->updateRelationship(
    collection: 'movies', 
    id: 'users', 
    onDelete: Database::RELATION_MUTATE_CASCADE
); 

// Update the relationship with custom reference attributes
$database->updateRelationship(
    collection: 'movies', 
    id: 'users', 
    onDelete: Database::RELATION_MUTATE_CASCADE, 
    newKey: 'movies_id', 
    newTwoWayKey: 'users_id', 
    twoWay: true
);

// Delete the relationship with the default or custom reference attributes
$database->deleteRelationship(
    collection: 'movies', 
    id: 'users'
);

use Utopia\Database\Document;             
use Utopia\Database\Helpers\ID;
use Utopia\Database\Helpers\Permission;
use Utopia\Database\Helpers\Role;

// Id helpers
ID::unique(padding: 12)        // Creates an id of length 7 + padding
ID::custom(id: 'my_user_3235')  

// Role helpers
Role::any()
Role::guests()
Role::user(
    identifier: ID::unique()
    status: 'active' //optional
)    
Role::users()
Role::team(
    identifier: ID::unique()
)
Role::team(
    identifier: ID::unique()
    dimension: '123'  //team:id/dimension
)
Role::label(
    identifier: 'admin'
)
Role::members(
    identifier: ID::unique()
)



// Permission helpers
Permission::read(Role::any()),
Permission::create(Role::user(ID::unique())),
Permission::update(Role::user(ID::unique(padding: 23))),
Permission::delete(Role::user(ID::custom(id: 'my_user_3235'))

// To create a document
$document = new Document([
    '$permissions' => [
        Permission::read(Role::any()),
        Permission::create(Role::user(ID::custom('1x'))),
        Permission::update(Role::user(ID::unique(12))),
        Permission::delete(Role::user($customId)),
    ],
    '$id' => ID::unique(),
    'name' => 'Captain Marvel',
    'director' => 'Anna Boden & Ryan Fleck',
    'year' => 2019,
    'price' => 25.99,
    'active' => true,
    'genres' => ['science fiction', 'action', 'comics'],
]);

$document = $database->createDocument(
    collection: 'movies', 
    document: $document
);

// Get which collection a document belongs to
$document->getCollection();

// Get document id
$document->getId();

// Check whether document in empty
$document->isEmpty();

// Increase an attribute in a document 
$database->increaseDocumentAttribute(
    collection: 'movies', 
    id: $document->getId(),
    attribute: 'name', 
    value: 24,
    max: 100
);

// Decrease an attribute in a document
$database->decreaseDocumentAttribute(
    collection: 'movies', 
    id: $document->getId(),
    attribute: 'name', 
    value: 24, 
    min: 100
);

// Update the value of an attribute in a document

// Set types
Document::SET_TYPE_ASSIGN, // Assign the new value directly
Document::SET_TYPE_APPEND, // Append the new value to end of the array
Document::SET_TYPE_PREPEND // Prepend the new value to start of the array
Note: Using append/prepend with an attribute which is not an array, it will be set to an array containing the new value.

$document->setAttribute(key: 'name', 'Chris Smoove')
         ->setAttribute(key: 'age', 33, Document::SET_TYPE_ASSIGN);

$database->updateDocument(
    collection: 'users', 
    id: $document->getId(), 
    document: $document
);         

// Update the permissions of a document
$document->setAttribute('$permissions', Permission::read(Role::any()), Document::SET_TYPE_APPEND)
         ->setAttribute('$permissions', Permission::create(Role::any()), Document::SET_TYPE_APPEND)
         ->setAttribute('$permissions', Permission::update(Role::any()), Document::SET_TYPE_APPEND)
         ->setAttribute('$permissions', Permission::delete(Role::any()), Document::SET_TYPE_APPEND)

$database->updateDocument(
    collection: 'users', 
    id: $document->getId(), 
    document: $document
);

// Info regarding who has permission to read, create, update and delete a document
$document->getRead(); // returns an array of roles that have permission to read the document
$document->getCreate(); // returns an array of roles that have permission to create the document
$document->getUpdate(); // returns an array of roles that have permission to update the document
$document->getDelete(); // returns an array of roles that have permission to delete the document

// Get document with all attributes
$database->getDocument(
    collection: 'movies', 
    id: $document->getId()
); 

// Get document with a sub-set of attributes
$database->getDocument(
    collection: 'movies', 
    id: $document->getId(), 
    queries: [
        Query::select(['name', 'director', 'year'])
    ]
);

// Find documents 

// Query Types
Query::equal(attribute: "...", values: ["...", "..."]),
Query::notEqual(attribute: "...", value: "..."),
Query::lessThan(attribute: "...", value: 100),
Query::lessThanEqual(attribute: "...", value: 1000),
Query::greaterThan(attribute: "...", value: 1000),
Query::greaterThanEqual(attribute: "...", value: ...),  
Query::contains(attribute: "...", values: ["...", "..."]),
Query::between(attribute: "...", start: 100, end: 1000),
Query::search(attribute: "...", value: "..."),
Query::select(attributes: ["...", "..."]),
Query::orderDesc(attribute: "..."),
Query::orderAsc(attribute: "..."),
Query::isNull(attribute: "..."),
Query::isNotNull(attribute: "..."),
Query::startsWith(attribute: "...", value: "..."),
Query::endsWith(attribute: "...", value: "..."),
Query::limit(value: 35),
Query::offset(value: 0),

$database->find(
    collection: 'movies', 
    queries:  [
        Query::equal(attribute: 'name', values: ['Captain Marvel']),
        Query::notEqual(attribute: 'year', values: [2019])
    ], 
    timeout: 1 //timeout is optional
);  

// Find a document 
$database->findOne(
    collection: 'movies', 
    queries:  [
        Query::equal(attribute: 'name', values: ['Captain Marvel']),
        Query::lessThan(attribute: 'year', value: 2019)
    ]
);  

// Get count of documents 
$database->count(
    collection: 'movies', 
    queries:  [
        Query::equal(attribute: 'name', values: ['Captain Marvel']),
        Query::greaterThan(attribute: 'year', value: 2019)
    ], 
    max: 1000 // Max is optional
);

// Get the sum of an attribute from all the documents
$database->sum(
    collection: 'movies', 
    attribute: 'price', 
    queries:  [
        Query::greaterThan(attribute: 'year', value: 2019)
    ],
    max: null // max = null means no limit
); 

// Delete a document
$database->deleteDocument(
    collection: 'movies', 
    id: $document->getId()
);

// Delete a cached document
Note: Cached Documents or Collections are automatically deleted when a document or collection is updated or deleted 
$database->purgeCachedDocument(
    collection: 'movies', 
    id: $document->getId()
);

bash
composer