market-media / datalayer
O datalayer é um componente de abstração persistente do seu banco de dados que utiliza PDO.
Requires
- php: >=8.2
- ext-pdo: *
README
O data layer é um componente para abstração de persistência no seu banco de dados que usa PDO com prepared statements para executar rotinas comuns como cadastrar, ler, editar e remover dados.
Destaques
- Fácil de configurar (Fácil de configurar)
- Asbtração total do CRUD
- Criar modelos seguros (Crie de modelos seguros)
- Compositor pronto (Pronto para o compositor)
- Compatível com PSR-2 (Compatível com PSR-2)
Instalação
A camada de dados está disponível via Composer:
"market-media/datalayer": "2.0.*"
ou rode
composer require market-media/datalayer
Documentação
Para mais detalhes sobre como usar o Data Layer, veja a pasta de exemplo com detalhes no diretório do componente
Conexão
Para começar a usar o Data Layer precisamos de uma conexão com o seu banco de dados. Para ver as conexões possíveis acesse o manual de conexões do PDO em PHP.net
const DATA_LAYER_CONFIG = [ "driver" => "mysql", "host" => "localhost", "port" => "3306", "dbname" => "datalayer_example", "username" => "root", "passwd" => "", "options" => [ PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, PDO::ATTR_CASE => PDO::CASE_NATURAL ] ];
Seu modelo
O Data Layer é baseado em uma estrutura MVC com os padrões de projeto Layer Super Type e Active Record. Logo para consumir é necessário criar o modelo de sua tabela e herdar o Data Layer.
<?php class User extends DataLayer { /** * User constructor. */ public function __construct() { //string "TABLE_NAME", array ["REQUIRED_FIELD_1", "REQUIRED_FIELD_2"], string "PRIMARY_KEY", bool "TIMESTAMPS" parent::__construct("users", ["first_name", "last_name"]); } }
find
<?php use Example\Models\User; $model = new User(); //find all users $users = $model->find()->fetch(true); //find all users limit 2 $users = $model->find()->limit(2)->fetch(true); //find all users limit 2 offset 2 $users = $model->find()->limit(2)->offset(2)->fetch(true); //find all users limit 2 offset 2 order by field ASC $users = $model->find()->limit(2)->offset(2)->order("first_name ASC")->fetch(true); // find all users with in operator $users = $model->find()->in("id", [1, 2, 3])->fetch(true); //looping users foreach ($users as $user) { echo $user->first_name; } //find one user by condition $user = $model->find("first_name = :name", "name=Robson")->fetch(); echo $user->first_name; //find one user by two conditions $user = $model->find("first_name = :name AND last_name = :last", "name=Robson&last=Leite")->fetch(); echo $user->first_name . " " . $user->first_last; //find one user by condition and with in operator $user = $model->find("first_name = :name", "name=Robson")->in("last_name",["Menezes", "Sampaio"])->fetch(true); foreach ($users as $user) { echo $user->first_name . " " . $user->first_last; }
findById
<?php use Example\Models\User; $model = new User(); $user = $model->findById(2); echo $user->first_name;
secure params
Consulte exemplo find_example.php e classes modelo
<?php $params = http_build_query(["name" => "UpInside & Associated"]); $company = (new Company())->find("name = :name", $params); var_dump($company, $company->fetch());
join method
Consulte exemplo find_example.php e classes modelo
<?php $addresses = new Address(); $address = $addresses->findById(22); //get user data to this->user->[all data] $address->user(); var_dump($address);
count
<?php use Example\Models\User; $model = new User(); $count = $model->find()->count();
save create
<?php use Example\Models\User; $user = new User(); $user->first_name = "Robson"; $user->last_name = "Leite"; $userId = $user->save();
save update
<?php use Example\Models\User; $user = (new User())->findById(2); $user->first_name = "Robson"; $userId = $user->save();
destroy
<?php use Example\Models\User; $user = (new User())->findById(2); $user->destroy();
fail
<?php use Example\Models\User; $user = (new User())->findById(2); if($user->fail()){ echo $user->fail()->getMessage(); }
custom data method
<?php class User{ public function fullName(): string { return "{$this->first_name} {$this->last_name}"; } public function document(): string { return "Restrict"; } } echo $this->full_name; //Robson V. Leite echo $this->document; //Restrict
join method
<?php $user = new User(); // Exemplo usando inner JOIN $results = $user->find("users.status = :s", "s=active", "users.id, users.name, roles.title") ->join("roles", "roles.id = users.role_id") ->fetch(true); // Exemplo encadeando múltiplos JOINS (INNER e LEFT) $complexResult = $user->find(null, null, "users.*, posts.title, logs.created_at") ->join("posts", "posts.user_id = users.id") ->join("logs", "logs.user_id = users.id", "LEFT") ->order("users.name ASC") ->fetch(true);
transaction
<?php $user = new User(); $address = new Address(); // Inicia a transação $user->beginTransaction(); // Preenche os dados do usuário $user->first_name = "João"; $user->last_name = "Silva"; if (!$user->save()) { // Se falhar, desfaz a transação e exibe o erro $user->rollBack(); echo $user->fail()->getMessage(); exit; } // Preenche os dados do endereço com o ID do usuário recém-criado $address->user_id = $user->id; // Aqui o Active Record já populou o ID $address->street = "Rua das Flores"; $address->number = "123"; if (!$address->save()) { // Se o endereço falhar, o usuário criado acima TAMBÉM SERÁ APAGADO (Rollback) $address->rollBack(); echo $address->fail()->getMessage(); exit; } // Se tudo deu certo, consolida as alterações no banco de dados $user->commit(); echo "Usuário e endereço cadastrados com sucesso!";
License
The MIT License (MIT). Please see License File for more information.