Instrumente ORM si DB foarte minimaliste pentru PHP

Stiu destul de multe proiecte similare, dar toate nu ma satisfac. Prin urmare, am facut o lista de cerinte pe care ar trebui sa le indeplineasca biblioteca mea perfecta ORM.

Desi exista instrumente care se conformeaza unor cerinte, nu am reusit sa gasesc o biblioteca care sa aiba totul.

Selectati utilizarea:

$ select = (new Select (“my_table”)) -> join (“STANGA INSCRIETI-va pe another_table USING (join_column)”) -> unde (“filter_column =?”, $ filterColumnValue) -> setConnection ($ db); $ count = $ select-> count (“ID DISTINCT”); $ randuri = $ select-> execute () -> fetchAll (\ PDO :: FETCH_ASSOC);

Puteti seta moduri de preluare pentru Selectare:

$ select-> setFetchMode (\ PDO :: FETCH_ASSOC); $ select-> setFetchClass (MyTableEntity :: class); $ select-> setFetchInto (new MyTableEntity ());

Lucrul cu mai multe conexiuni DB:

$ txManager = new \ tinyorm \ TxManager (); $ txManager-> registerConnection ($ this-> connection) -> registerConnection ($ this-> connection2); $ result = $ txManager-> atomic (function () {$ this-> connection-> exec (“INSERT INTO test (c_unique) VALUES (‘val1’)”); $ this-> connection2-> exec (“INSERT INTO test (c_unique) VALUES (‘val2’) “); return true;});

In acest fel, daca ceva nu merge bine cu primul sau al doilea INSERT, tranzactiile din ambele conexiuni vor fi derulate inapoi, nu vor fi inserate randuri. Pe de alta parte, daca totul merge bine, tranzactiile in ambele conexiuni vor fi angajate.

Managerul de tranzactii accepta tranzactii imbricate, iar clasa tinyorm \ Db le accepta.

Am folosit o abordare similara cu cea a Zend Framework 2 (http://framework.zend.com/manual/current/en/user-guide/database-and-models.html). Clasele de entitati sunt doar simple containere de date care nu au logica de conexiune / persistenta DB. Cu toate acestea, in cele din urma, entitatile tinyorm au „cunostinte” minime despre relatia lor cu un strat de stocare. In primul rand, au metoda getSourceName () , care este in esenta menita sa returneze un tabel de stocare / numele colectiei. In al doilea rand, exista metode getPK () si setPK () pentru a accesa cheia primara. Coloana cheii primare nume este stocata in proprietatea pkName protejata . Si, in cele din urma, entitatile au getSequenceName (). Am facut toate acestea de dragul simplitatii, pentru a nu fi nevoie sa introduc mai multe clase. tinyorm accepta doar cheile primare ed AUTO_INCREMENT . In contractele pentru Zend Framework 2, toate lucrurile legate de persistenta sunt doar cateva clase / interfete:

  • DbInterface – interfata pentru conectorul Db
  • Db – un invelis in jurul DOP
  • persistence \ Driver – interfata pentru driverul de persistenta
  • persistence \ DbDriver – implementarea driverului de persistenta cu Db / PDO (deci RDBMS) ca backend. Testat numai cu MySQL, desi ar trebui sa functioneze bine si cu Postgres si Sqlite
  • persistence \ HsDriver – implementare driver de persistenta cu handlersocket ca backend.

Driverul de persistenta functioneaza pe entitati. In cazul ZF2, putem vorbi despre Gateway-ul lor de tabel ca un driver de persistenta. Consultati linkul de mai sus pentru referinta. In tinyorm, lucrurile sunt mult mai simple. Trebuie doar sa creati o instanta de driver de persistenta si sa apelati metodele sale ‘ save () , insert () , update () , delete () care furnizeaza o entitate ca argument.

Pentru un obiect de interogare, am aruncat o privire asupra cadrului Phalcon (https://docs.phalconphp.com/en/latest/api/Phalcon_Mvc_Model_Query_Builder.html). Cu toate acestea, am modificat putin interfata, asa ca mi se pare putin mai buna.

De asemenea, am implementat un manager de tranzactii de baze de date capabil sa gestioneze mai multe conexiuni DB.

Multumim RasmiKanta Moharana (https://github.com/rashmi8105) pentru feedback-ul timpuriu si identificarea erorilor in aplicatia de exemplu!