Lære ORM og Laravel 5

Som PHP-utvikler har du kanskje kommet over ordet ORM. ORM er en måte å jobbe med databaser på, på samme måte som du jobber med klasser og objekter. Hvis du skulle dykke dypere inn i hvordan webapplikasjoner er utformet og bygd, etter å ha gjort noen undersøkelser i deres ORM, finner du to kjente mønstre: Aktiv post og Data Mapper.

Active Record refererer til å kartlegge et objekt til en databaserad. Faktisk er hver rad i databasen bundet til en gjenstand. Når du henter en rad fra databasen, kan du oppdatere, slette eller lagre ved hjelp av selve objektet. Slik jobber Eloquent og Paris, og hvordan det er gjort i Ruby on Rails.

På den andre siden, Data Mapper er et lag av programvare som skiller inn-minneobjektene fra databasen. Med Data Mapper behøver ikke objekter i minnet å vite at det er enda en database tilstede. De trenger ingen SQL-grensesnittkode eller kunnskap om databaseskjemaet. En slik løsning er Lære.

Hva er læren?

Læren er en ORM som implementerer data mapper mønsteret og lar deg gjøre en ren separasjon av søknadens forretningsregler fra persistenslaget av databasen.

Noen av fordelene jeg oppdaget mens jeg brukte Lære med Laravel er:

  • Raskere og enklere å bruke.
  • Enheter er bare enkle PHP-objekter.
  • Lære utnytter en "kode først" tilnærming, slik at du kan opprette enheter først, og deretter generere en database for dem automatisk. Omvendt sak er også mulig, men jeg anbefaler det ikke.
  • Støtter annotasjoner, XML og YAML for skjema.
  • DQL (en erstatning for SQL) abstrakt dine bord unna.
  • Lære arrangementer lar deg enkelt koble til bestemte databasehendelser og utføre bestemte handlinger.
  • Oppbevaringssteder er mer trofaste til depotmønsteret.
  • Transaksjonsskriving Metodologi lar doktrinen ha mindre interaksjon med databasen til flush () Metoden kalles.

Selvfølgelig har doktrinen også ulemper, men det er opp til programmøren å velge riktig ORM.

Lære DQL

DQL står for lærespråk. DQL gir deg objekt for spørrespråk, noe som betyr at i stedet for et tradisjonelt forholdsspørsmål, har du spørsmål i objektform.

DQL lar deg skrive databasespørsmål på en objektorientert måte, noe som er nyttig når du trenger å spørre databasen på en måte som ikke kan oppnås (eller er svært vanskelig) ved hjelp av standard lagringsmetoder.

Eksempel DQL spørring:

sql SELECT b.id som ItemId, b.title som ItemTitle, b.url som ItemUrl FRA Alireza \ Domain \ Identity \ Entities \ Meny u WHERE u.id =: id

Lærefiltre

Lære lar deg begrense søksresultater med filtre. For eksempel kan det hende du vil redigere kun informasjonen til den innloggede brukeren, eller sørg for at den nåværende klientens data ble returnert fra databasen. Et filter er en automatisk løsning for å huske spesifikke forhold for alle dine spørsmål.

Lære gir begrensninger på SQL-nivå, så det er ikke nødvendig å opprettholde klausulen i flere arkiver av prosjektet ditt. Dette øker sikkerheten og gjør koden enklere å lese.

La oss se på et eksempel:

php / ** * @ManyToOne (targetEntity = "User") * @JoinColumn (navn = "user_id", referertColumnName = "id") ** / privat $ bruker; Som du kan se i brukerenheten, er resultatet av JoinColumn er begrenset til kun gjenstander med betingelse av WHERE user_id =: user_id.

Setter opp Lære 2

For å sette opp doktrinen, er det en bro for å tillate samsvar med Laravel 5s eksisterende konfigurasjon. For å installere Lære 2 i Laravel-prosjektet, kjører vi følgende kommando:

bash komponist krever laravel-doktrin / orm

Som vanlig skal pakken legges til app / config.php, som tjenesteleverandør:

php LaravelDoctrine \ ORM \ DoctrineServiceProvider :: klasse,

Aliaset skal også konfigureres:

php 'EntityManager' => LaravelDoctrine \ ORM \ Fasader \ EntityManager :: klassen

Endelig publiserer vi pakke konfigurasjonen med:

bash php artisan leverandør: publiser - tag = "config"

Læren trenger ingen databasekonfigurasjon og bruker den nåværende Laravel-konfigurasjonen, men hvis du vil overstyre den, bør du endre doktrinets konfigurasjonsfil i Config / doctrine.php:

"php 'managers' => ['standard' => ['dev' => env ('APP_DEBUG'), 'meta' => env ('DOCTRINE_METADATA', 'annoteringer'), 'connection' => env DB_CONNECTION ',' mysql '),' namespaces '=> [' App '],

"Det er alt der er til det.

Hva er en enhet?

"Entitet" refererer til et objekt som har en tydelig identitet. Et foretak må ha en bestemt identifikator som er unik gjennom hele systemet, for eksempel en kunde eller en student. Det ville være andre objekter, for eksempel e-postadresser, som ikke er enheter, men verdier objekter.

La oss lage en postenhet App / Entity / post.php:

"php navneområde App \ Entity;

bruk doktrin \ ORM \ Kartlegging som ORM;

/ ** * @ORM \ Entity * @ORM \ Tabell (navn = "innlegg") * @ORM \ HasLifecycleCallbacks () * / klasse Post / ** * @var heltall $ id * @ORM \ Column (name = " id ", type =" heltall ", unikt = true, nullable = false) * @ORM \ Id * @ORM \ GeneratedValue (strategi =" AUTO ") * * / privat $ id;

/ ** * @ORM \ Kolonne (type = "streng") * / privat $ title; / ** * @ORM \ Kolonne (type = "tekst") * / privat $ kropp; offentlig funksjon __construct ($ input) $ this-> setTitle ($ input ['title']); $ Dette-> setBody ($ inngang [ 'legemet']);  offentlig funksjon getId () return $ this-> id;  offentlig funksjon getTitle () return $ this-> title;  offentlig funksjon setTitle ($ title) $ this-> title = $ title;  offentlig funksjon getBody () return $ this-> body;  offentlig funksjon setBody ($ body) $ this-> body = $ body;  "

Klasseegenskapene skal være de samme som feltene i databasetabellen, eller du kan definere dem med @Colum ( "navn" = "myfield") merknad.

Hva er et arkiv?

Lageret lar all koden din bruke objekter uten å måtte vite hvordan gjenstandene er vedvarende. Lageret inneholder all kunnskap om utholdenhet, inkludert kartlegging fra tabeller til objekter. Dette gir en mer objektorientert visning av persistenslaget og gjør kartleggingskoden mer innkapslet.

Nå er det på tide å lage Oppbevaringssted i App / Repository / PostRepo.php:

"php namespace App \ Repository; bruk App \ Entity \ Post; bruk doktrin \ ORM \ EntityManager;

klasse PostRepo

/ ** * @var string * / private $ class = 'App \ Entity \ Post'; / ** * @var EntityManager * / private $ em; offentlig funksjon __construct (EntityManager $ em) $ this-> em = $ em;  offentlig funksjon opprette (Post $ post) $ this-> em-> vedvarer ($ post); $ Dette-> em> flush ();  offentlig funksjon oppdatering (Post $ post, $ data) $ post-> setTitle ($ data ['title']); $ Post-> setBody ($ data [ 'legemet']); $ Dette-> em> vedvare ($ post); $ Dette-> em> flush ();  offentlig funksjon PostOfId ($ id) return $ this-> em-> getRepository ($ this-> class) -> findOneBy (['id' => $ id]);  Offentlig funksjon slette (Post $ post) $ this-> em-> remove ($ post); $ Dette-> em> flush ();  / ** * opprett Post * @return Post * / privat funksjon prepareData ($ data) returner nytt innlegg ($ data);  

"

Læren EntityManager Fungerer som tilgangspunkt for fullstendig styring av dine enheter. Deretter oppretter du kontrolleren App / Http / elektro / PostController.php:

"php namespace App \ Http \ Controllers; bruk App \ Repository \ PostRepo som repo; bruk App \ Validation \ PostValidator;

klasse PostController utvider Controller private $ repo;

offentlig funksjon __construct (repo $ repo) $ this-> repo = $ repo;  offentlig funksjon redigere ($ id = NULL) return View ('admin.index') -> med (['data' => $ this-> repo-> postOfId ($ id)]);  offentlig funksjon editPost () $ all = Input :: all (); $ validate = PostValidator :: validere ($ alle); hvis (! $ validere-> passerer ()) return omdirigering () -> tilbake () -> withInput () -> withErrors ($ validate);  $ Id = $ this-> repo-> postOfId ($ all ['id']); hvis (! er_null ($ Id)) $ this-> repo-> update ($ Id, $ all); Session :: flash ('msg', 'edit suksess');  ellers $ this-> repo-> create ($ this-> repo-> perpare_data ($ all)); Session :: flash ('msg', 'add success');  returnere omdirigering () -> tilbake ();  offentlig funksjon hente () return View ('admin.index') -> med (['Data' => $ this-> repo-> hente ()]);  offentlig funksjon slette () $ id = Input :: get ('id'); $ data = $ this-> repo-> postOfId ($ id); hvis (! er_null ($ data)) $ this-> repo-> slette ($ data); Session :: flash ('msg', 'operation Suksess'); returnere omdirigering () -> tilbake ();  else return redirect () -> tilbake () -> withErrors ('operationFails');  "Visning og ruting er det samme som vanlig. 

Jeg foretrekker å lage min egen Validator basert på Laravel's Validator klasse. Her er Validatoren App \ Validering \ PostValidator.php:

"php namespace App \ Validation; bruk Validator;

klasse PostValidator offentlig statisk funksjon validere ($ input) $ rules = ['title' => 'Påkrevd | Min: 4 | Maks: 80 | alpha_spaces', 'body' => 'Required',]; returnere Validator :: make ($ input, $ rules); "

Konklusjon

Hvis du ikke tidligere har jobbet med Lære 2, håper jeg denne artikkelen har vært interessant og informativ. Laravel 5 bruker ikke Lære, men som du kan se er det noen pakker som lar oss enkelt bruke den med Laravel. Jeg opprettet en enkel bloggapp med Laravel 5 og Doctrine ORM, og jeg håper dette kan hjelpe deg med å opprette ønsket app. Jeg aksepterer dine kommentarer.