nicollassilva/simplephp

This package is abandoned and no longer maintained. No replacement package was suggested.

A small CRUD project designed to assist daily routines and speed up the process of communicating with the database.

v1.9.0 2020-09-08 22:50 UTC

README

OBS: This package was replaced by the MinasORM package.

Maintainer Scrutinizer Code Quality PHP from Packagist Software License Latest Version Build Status Code Intelligence Status Total Downloads

Um pequeno projeto CRUD desenvolvido para auxiliar as rotinas diárias e acelerar o processo de comunicação com o banco de dados com segurança e transparência.

A small CRUD project developed to assist daily routines and speed up the process of communicating with the database with security and transparency.

Getting Started

Some precautions and step-by-step instructions for you to download and install the package.

Prerequisites

To be able to use SimplePHP you will need to have:

PHP ^7.2.5
EXT-PDO *

Installing

SimplePHP can be installed via composer.json or via the command terminal:

composer require nicollassilva/simplephp

or composer.json:

"nicollassilva/simplephp": "^1.9"
>>>>>>> Stashed changes

Connection

To configure the connection to the database, you must access: Source\Root\Config.php. Example of the file to be found:

protected $config = [
        "driver" => "mysql",
        "hostname" => "localhost",
        "charset" => "utf8mb4",
        "port" => 3306,
        "username" => "root",
        "password" => "",
        "database" => "",
        "timezone" => "America/Sao_Paulo",
        "pathLog" => __DIR__ . "/../../../../../your-log.log",
        "options" => [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_CASE => PDO::CASE_NATURAL,
            PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING
        ]
    ];

Example of your model

After completing the database configuration, create a folder at the root of the project where your Models will be and create the class.

  • You should extend and use the SimplePHP class namespace, as in the example:
namespace Models;

use SimplePHP\Model\SimplePHP;

class User extends SimplePHP {

    function __construct()
    {
        /**
         * @param string Table Name
         * @param string Primary Key
         */
        parent::__construct('users', 'id');
    }
}
  • You will need to inherit your model from the SimplePHP class, and in the magic constructor method, call the parent constructor with the name of the table for the referred model, and a primary key.

First use

After all the previous steps, create an index.php at the root of the project giving a require in the composer autoload and in your model class, after that, instantiate your model and you can start using SimplePHP. Below is an example:

    require "vendor/autoload.php";
    require "models/user.php";

use Models\User;

    $userModel = new User();
    $user = $userModel->find()->execute();

Installation Errors

Some mistakes and how to fix them

Fatal error: Uncaught Error: Class 'SimplePHP\Model\SimplePHP' not found

To fix it, execute the following command in the project's root folder:

composer dump -o

Documentation

Methods

find

use Models\User;

$userModel = new User();

/** find all users */
$user = $userModel->find()->execute();

/** find user by id */
$user = $userModel->find(5)->execute();

/** find users and return the total result count */
$count = $userModel->count()->execute();

/** find user with one where */
$user = $userModel->where([
                                     ['name', '=', 'Nicollas']
                                ])->execute();

/** find user with several where. Conditional AND default */
$user = $userModel->where([
                                     ['name', '=', 'John'],
                                     ['email', '=', 'johnmoppans@gmail.com']
                                ])->execute();

/** find user with LIKE. Conditional AND default */
$user = $userModel->where([
                                     ['name', 'LIKE', '%Guilherme%'],
                                     ['email', '=', 'guilherme@gmail.com']
                                ])->execute();

/** find user with conditional where. Condicional OR */
$user = $userModel->where([
                                     ['name', 'LIKE', '%Nicollas%'],
                                     ['name', 'LIKE', '%Nicolas%']
                                ], 'OR')->execute();

/** find users by name = Nicollas OR name = Nicolas */
$user = $userModel->where([
				     ['name', '=', 'Nicollas']
			])
			->orWhere([
				     ['name', '=', 'Nicolas']
			])->execute();

/** find user using the basic structure query */
$user = $userModel->whereRaw("name = 'Nicollas'")->execute();

/** find users with limit */
$user = $userModel->limit(5)->execute();

/** find users with limit & offset */
$user = $userModel->limit(5)->offset(5)->execute();

/** find users with skip & take | the same as limit & offset */
$user = $userModel->take(5)->skip(5)->execute();

/** find users with orderBy. second parameter optional, default ASC */
$user = $userModel->orderBy('id', 'DESC')->orderBy('name')->execute();

/** find users and return results as attributes. EXAMPLE: $user->name instead of $user['name'] */
$user = $userModel->find()->execute(true); 

/** find users with specific columns. */
$user = $userModel->find()->only(['name', 'id', 'email'])->execute();

/** find users creating exceptions in columns. */
$user = $userModel->find(5)->except(['password'])->execute();

/** search in other database table */
$user = (new User())->useTable('posts')->find()->where([['owner_id', '=', $user->id]])->execute();

/** debug query for possible errors | return string */
$user = $userModel->whereRaw("uuid = 'f031b537-672f-4fba-b8a6-af45e778ad93'")->debugQuery();

/** group by method */
$user = $userModel->groupBy('id');
  • Note: except() method does not work chained with the execute(true) method, only execute() without parameter true.

  • Note: except() method only works when looking for specific information, in multidimensional arrays it does not work. This will be fixed soon.

  • All methods are friendly to each other, that means you can make complex queries. Real example:

/** Search for a user's posts varying between the privacy in which it was saved */
/** You can pass false as a fourth argument, the class will understand that you are trying to relate tables and will not put single quotes */

$posts = (new User())->useTable('posts p, users u')
                             ->where([['u.id', '=', $user['id'] ?? $visit['id']],
                                      ['u.id', '=', 'p.user_id', false], /** example of the fourth argument for relating tables */
                                      ['p.privacity', '<=', isset($privacity) && is_array($privacity) ? 3 : ($visit['url'] != $flag ? 1 : 4)]])
                             ->only(['p.*', 'u.name', 'u.url', 'u.i_profile'])
                             ->limit(10)
                             ->orderBy('p.id')
                             ->execute();

destroy

use Models\User;

$userModel = new User();
$user = $userModel->find(3)->execute(true);

    /** @return null|bool */
    if($user->destroy()) {
        echo "Success delete!";
    }
  • Note: To delete an information, you need to be aware that there is a reference to that information, that is, the primary key.

save (update)

use Models\User;

$userModel = new User();
$user = $userModel->find(5)->execute(true);
$user->name = "Other name";
$user->email = "anyemail@gmail.com";

    /** @return null|bool */
    if($user->save()) {
        echo "Success!";
    }
  • Note: To save an information, you need to be aware that there is a reference to that information, that is, the primary key.
  • OBS: You can use the only() method to pull only the necessary information, but when editing, you can pass any column that exists in the database table and the system will proceed to treat and insert it. Example:
use Models\User;

$userModel = new User();
$user = $userModel->find(8)->only(['id', 'name'])->execute(true);
$user->name = "Russian Gabolev";

$user->email = "anyemail@gmail.com";
/** This informations was not called from the database, but they exist. */
$user->updated_at = time();

    /** @return null|bool */
    if($user->save()) {
        echo "Success!";
    }
  • OBS2: In case of failure, it will return NULL, if completed, it will return true.

create (insert)

use Models\User;

    $userModel = new User();
    $user = $userModel->request([
        "name" => "Dr. Haylie Bahringer",
        "email" => 'hayliebahringer@gmail.com', 
        "password" => 123456 // Encrypt before sending to the database
    ])->create();

It is also possible by passing a direct array:

use Models\User;

    $userModel = new User();
    $_POST = [
        "name" => "Hadjei Moccab",
        "email" => "hadjeiofficial@gmail.com",
        "password" => 123456 // Encrypt before sending to the database
    ];
    $user = $userModel->request($_POST)->create();
  • OBS2: In case of failure, it will return NULL, if completed, it will return true.

Others methods

use Models\User;

    $userModel = new User();
    $user = $userModel->find(18)->execute(true);
    
    /** @return string | @param string $hash, @param Array $options */
    $user->password = $userModel->hashFormat($_POST['password']);
    
    /** @return string | @param string $url */
    $user->home = $userModel->urlFormat('Dr. John,Sik!@'); // dr-john-sik
    
    /** @return bool | @param string $email */
    if(!$userModel->validateEmail($_POST['email'])) {
        echo "Invalid email!";
    }
    
    /** @return bool | @param string $pass */
    if(!$userModel->validatePassword($_POST['password'])) {
        echo "Invalid password!";
    }
    
    /** @return bool | @param string $phone */
    if(!$userModel->validatePhone($_POST['telephone'])) {
        echo "Invalid telephone!";
    }
    
    /** @return bool | @param int $size */
    $user->recovery_token = $userModel->aleatoryToken(15);
    
    $user->save()
  • Guide to the above methods:
  • hashFormat: Encrypt a password using the native password_hash function.
  • urlFormat: Formats a string to a friendly url.
"Pác^kà@gê Sí#mp%lePHP" -> "pac-ka-ge-si-mp-lephp"
  • validateEmail: Validates that the email entered is valid. All true:
fulano@saopaulo.com.br
chico@gmail.com
joao@empresa.info.br
maria_silva@registro.br
rafa.sampaio@yahoo.com
fulano+de+tal@escola.ninja.br
  • validatePassword: Checks whether the password contains an uppercase and lowercase letter, a special character, a number, if it is greater than 6 characters and less than 20.
123456 // false
QUASE123! // false
#OpA1 // false
#essaSenhaEGrande1234 // false
#OpA1? // true
Foi123! // true
  • validatePhone: Checks whether the phone number you entered is valid. (hyphen not required)
(00)0000-0000
(00)00000-0000
0000-0000
00000-0000
  • aleatoryToken: Generates a random string with the given size.

Errors during Execution

When an error is generated by SimplePHP, it will appear in the directory configured in the folder configuration, the report is generated by the monolog package.

Authors

License

This project is licensed under the MIT License - see the LICENSE.md file for details