nicollassilva / simplephp
A small CRUD project designed to assist daily routines and speed up the process of communicating with the database.
Requires
- php: ^7.2.5
- ext-pdo: *
- monolog/monolog: ^2.1
This package is auto-updated.
Last update: 2023-05-12 03:28:25 UTC
README
OBS: This package was replaced by the MinasORM package.
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
- Nícollas Silva - Developer - NicollasSilva
License
This project is licensed under the MIT License - see the LICENSE.md file for details