Bruke Lys opp databasen med eloquent i PHP App uten Laravel

Illuminate er Laravel's database engine minus Laravel. Den leveres med Eloquent ORM i Laravel. Hvis du vil bygge PHP-appene dine med ORMer og foretrekker å ikke bruke Laravel, er denne opplæringen for deg.

I denne opplæringen skal vi bygge bakenden for en Q & A App med PHP, Illuminate Database og Eloquent ORM.

Prosjektavhengigheter 

  1. PHP: 5.5+
  2. MYSQL
  3. komponist

App kapasiteter

Vår app vil utføre ti oppgaver:

  • Legg til en bruker.
  • Legg til et spørsmål.
  • Legg til et svar på et spørsmål. 
  • Oppgi et svar.
  • Få et spørsmål med svar.
  • Få alle spørsmål og brukere som spurte dem.
  • Få spesielle spørsmål, svar og opprør.
  • Telle spørsmål av en bestemt bruker.
  • Oppdater svar av bruker.
  • Slett et spørsmål.

Først oppretter vi prosjektkatalogen og strukturen.

I hovedprosjektmappen lager vi en app mappe, og deretter i denne appmappen, oppretter vi to mapper:modeller og kontrollere. I dette bildet heter vår hovedprosjektmappe veltalende. Du bør erstatte det med hvilket navn du helst foretrekker.

Deretter oppretter vi en index.php fil i hovedprosjektmappen, på samme nivå som app mappe.

Vi bruker git, så vi lager en .gitignore-fil. Merk at dette trinnet er valgfritt.

Deretter installerer vi de avhengighetene som trengs for at dette prosjektet skal fungere. I hovedprosjektmappen lager vi en komponent.json-fil. Lim inn dette i vår komponent.json-fil.

"Navn": "belyser-eksempel / veltalende", "beskrivelse": "Gjennomføring av databasespørsmål med belyser og utallige", "type": "prosjekt", "krever": 

For å installere Illuminate-databasen, legger vi dette til vår composer.json:
"Belys / database": "5.1.8",.

Deretter legger vi til psr-4 autoloading for våre modeller og kontrollere:

"Autoload": "psr-4": "Controllers \\": "app / controllers /", "Modeller \\": "app / models /"

Nå skal vår komponent.json-fil se slik ut:

"Navn": "belyser-eksempel / veltalende", "beskrivelse": "Gjennomføring av databasespørsmål med belyser og eloquent", "type": "prosjekt", "krever": "belyser / database": "5.1. 8 "," autoload ": " psr-4 ": " Controllers \\ ":" app / controllers / "," Modeller \\ ":" app / models / " 

Vi vil nå kjøre disse to komponentkommandoene på samme sted som vår komponer.json-fil:

komponist installere komponent dump-autoload -o

Dette vil generere en leverandørmappe som vi kan legge til i gitignore (dette er også et valgfritt trinn).

La oss legge til en config-fil for vår databaseinformasjon.

I hovedprosjektkatalogen lager vi en fil med navnet config.php og definerer DB-detaljer i Config.php-filen. Vær oppmerksom på at verdiene skal erstattes med dine egne tilkoblingsdetaljer.

Deretter oppretter vi skjemaet for appen vår.

En ting å merke seg før vi lager skjemaet for tabellene i vår database er at vi kan legge til tidsstempler i skjemaet vårt.

Eloquent ORM forventer to tidsstempel kolonner hvis vi vil aktivere tidsstempeloperasjon på en bestemt tabell / modell. De er created_at og updated_at kolonner. Hvis vi aktiverer tidsstempler for en modell, oppdaterer Eloquent disse feltene automatisk når vi lager eller oppdaterer en plate.

Det er en tredje kolonne kalt deleted_at. De deleted_at tidsstempel virker annerledes, skjønt. Eloquent har en myk slette evne som bruker deleted_at kolonne for å avgjøre om en post er slettet. Hvis du sletter en post med den veltalende "slett" -funksjonen og aktiverer Myk sletting, oppdateres kolonnen med slettingen. Disse slettede elementene kan da hente seg når som helst.

I denne appen vil vi dra nytte av tidsstemplene, så vi bruker alle tre i Schema-opprettelsen.

Opprett tabeller med følgende kommandoer i MySQL:

spørsmål

CREATE TABLE 'questions' ('id' int (11) unsigned IKKE NULL AUTO_INCREMENT, 'question' tinytext, 'user_id' int (11) DEFAULT NULL, 'created_at' tidsstempel NULL DEFAULT NULL, 'updated_at' tidsstempel NULL DEFAULT NULL, ' deleted_at 'tidsstempel NULL DEFAULT NULL, PRIMARY KEY (' id ')) MOTOR = InnoDB DEFAULT CHARSET = utf8;

svar

CREATE TABLE 'answers' ('id' int (11) usignert IKKE NULL AUTO_INCREMENT, 'svar' tinytext, 'user_id' int (11) DEFAULT NULL, 'question_id' int (11) DEFAULT NULL, 'created_at' tidsstempel NULL DEFAULT NULL , 'updated_at' tidsstempel NULL DEFAULT NULL, 'deleted_at' tidsstempel NULL DEFAULT NULL, PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;

Upvotes

CREATE TABLE 'upvotes' ('id' int (11) usignert IKKE NULL AUTO_INCREMENT, 'answer_id' int (11) DEFAULT NULL, 'user_id' int (11) DEFAULT NULL, 'created_at' tidsstempel NULL DEFAULT NULL, 'updated_at' tidsstempel NULL DEFAULT NULL, 'deleted_at' tidsstempel NULL DEFAULT NULL, PRIMARY KEY ('id')) MOTOR = InnoDB DEFAULT CHARSET = utf8;

brukere

CREATE TABLE 'users' ('id' int (11) unsigned IKKE NULL AUTO_INCREMENT, 'brukernavn' varchar (100) DEFAULT NULL, 'email' varchar (200) DEFAULT NULL, 'passord' varchar (200) DEFAULT NULL, 'created_at 'tidsstempel NULL DEFAULT NULL,' updated_at 'tidsstempel NULL DEFAULT NULL,' deleted_at 'tidsstempel NULL DEFAULT NULL, PRIMARY KEY (' id ')) MOTOR = InnoDB DEFAULT CHARSET = utf8;

Vi fortsetter ved å lage filer til modeller og kontrollører for våre bord på følgende steder:

  • project_folder / app / modeller / question.php
  • project_folder / app / modeller / answer.php
  • project_folder / app / modeller / upvote.php
  • project_folder / app / modeller / user.php
  • project_folder / app / modeller / database.php
  • project_folder / app / kontrollere / questions.php
  • project_folder / app / kontrollere / answers.php
  • project_folder / app / kontrollere / upvotes.php
  • project_folder / app / kontrollere / users.php

Åpen modeller / database.php med en redaktør.

Først oppretter vi kapselen:

addConnection (['driver' => DBDRIVER, 'host' => DBHOST, 'database' => DBNAME, 'brukernavn' => DBUSER, 'passord' => DBPASS, 'charset' => 'utf8' => 'utf8_unicode_ci', 'prefix' => ",]); / / Oppsett Eloquent ORM ... $ kapsel-> bootEloquent ();

I filen ovenfor initialiserer og konfigurerer du kapselen med konstanter som er definert i config.php, og så starter vi veltalende.

Det neste trinnet er å lage et startskript. Dette blir en fil der alt som må kjøres før appen vår fungerer, kjøres.

Vi lager en startfil på stedet project_folder / start.php, og deretter i filen, krever Composer autoload-filen:

krever 'leverandør / autoload.php';

Etter det krever vi config.php for å få legitimasjonsbeskrivelsene definert: krever 'config.php';

Da initialiserer vi databaseklassen.

Din start.php skal se slik ut:

Inkluder start.php i index.php da dette blir vår hovedfil.

Vår index.php fil ser nå slik ut:

 

Deretter kan vi begynne å jobbe med våre kontrollere og modeller. I project_folder/ App /modeller / question.php, vi legger til dette:

Så i project_folder/app/controllers/questions.php:

project_folder/app/controllers/answers.php, vi gjør det samme:

Oppgave 1: Legg til en bruker

I brukermodellen (project_folder/app/models/user.php), vi legger til følgende kode for å definere vårt navneområde, utvide Eloquent-modellen og definere tabellnavnet (beskyttet $ bord) og hvilke felt i tabellene kan fylles av masseopprettelse (beskyttet $ fyllbar).

I brukerens kontroller (project_folder/app/controllers/user.php), definerer vi vårt navneområde og klasse som vanlig:

Deretter for å opprette en bruker, i brukerens kontroller, importerer vi brukernavnet, bruk modeller \ bruker;, og legg til en funksjon for å opprette brukeren.

$ Brukernavn, 'e' => $ epost, 'passord' => $ passord]); returnere $ bruker; 

Vår brukerkontroller ser nå ut som dette.

$ Brukernavn, 'e' => $ epost, 'passord' => $ passord]); returnere $ bruker; ?>

Deretter i index.php legger vi til disse linjene og kjører appen for å opprette en ny bruker.

Oppgave 2: Legg til et spørsmål

For å legge til et spørsmål, importerer vi spørsmålsmodellens navneområde i spørsmålskontrollen, og skriver en create_question funksjon:

bruk modeller \ spørsmål;

Deretter:

$ Spørsmålet 'BRUKER-ID' => $ user_id]); returnere $ spørsmål;  

Vi har brukt Eloquent massebeskrivelsesmodeller til å sette inn denne posten, men før det virker, må vi tillate at feltene fylles ut, fordi Eloquent-modellene som standard vekter mot masseopprettelse som standard.

Så vi går til spørsmål modell og legg til beskyttet $ fyllbar eiendom til klassen.

beskyttet $ fillable = ['question', 'user_id'];

Hvis du vil kjøre dette, importerer du spørsmålskontrollen i index.php og ringer til create_question fungere statisk:

bruk Controllers \ Question;

Deretter oppretter du et spørsmål med et spørsmål og bruker-ID som parametere:

$ question = Spørsmål :: create_question ("Har du noen gang møtt din doppelganger?", 1);

Dette returnerer et modellobjekt hvis det lykkes.

Vi skal nå kjøre index.php script med forskjellige oppføringer for å legge til flere spørsmål i databasen.

Oppgave 3: Legg til et svar på et spørsmål 

I svarmodellen gjentar vi trinnene som er tatt for spørsmål og brukermodeller ved å legge til koden nedenfor:

Så i svarkontrollen skriver vi disse linjene:

$ answer, 'question_id' => $ question_id, 'user_id' => $ user_id]); return $ answer; ?>

Deretter i index.php kan vi lage et svar på spørsmålet med ID 1 vi la til tidligere, med bruker ID 2. Ikke glem å importere svarkontrollen til index.php først.

For å forhindre flere oppføringer, kommentere alle andre anrop i index.php før du kjører en ny.

Oppgave 4: Oppgi et svar

Dette er ganske mye de samme trinnene vi er vant til.

Så kopierer vi dette til Upvote-modellen på project_folder/ App /modeller / upvote.php.

Deretter importerer vi navnet på Upvote Model i svarkontrollene.

bruk Modeller \ Upvote;

Deretter oppretter vi en upvote_answer funksjon.

$ Answer_id, 'user_id' => $ user_id]); returner $ upvote; 

I index.php kan vi ringe funksjonen med en dummy Bruker ID for å oppvote svaret med id 1.

$ upvote = Svar :: upvote_answer (1,14); 

Oppgave 5: Få et spørsmål med svar

For oppgaver som dette, kan vi bruke Eloquent-relasjoner.

Typer relasjoner inkluderer en til en, en til mange, mange til mange, osv.

Ved bruk av disse relasjonene antar Eloquent en fremmed nøkkel i skjemaet modell navnDet finnes på modellene. For denne oppgaven er forholdet et til mange forhold fordi et enkelt spørsmål kan eie noen mengde svar.

Først definerer vi dette forholdet ved å legge denne funksjonen til vår spørsmålsmodell.

hasMany ( '\ modellene \ Svar'); 

Deretter i spørsmålskontrollen skriver vi en funksjon for å få spørsmål med svar.

få () -> toArray (); returnere $ spørsmål; 

Dette henter spørsmålene med tilhørende svar.

I index.php kommenterer vi alle andre samtaler og kjører:

$ all = Spørsmål :: get_questions_with_answers ();

Vi kan var_dump eller print_r de $ alle variabel for å se resultatene.

Oppgave 6: Få alle spørsmål og brukere som spurte dem

Dette er et forhold mellom ett og ett fordi ett spørsmål har en bruker, så vi legger til dette på spørsmålet.

belongsTo ( '\ modellene \ Bruker'); 

Deretter lager vi en funksjon i spørsmålskontrollen og bruker med Fungerer på spørsmålet.

få () -> toArray (); returnere $ spørsmål; 

I index.php, kommentere alle andre og kjør dette:

$ all_with_users = Spørsmål :: get_questions_with_users ();

Oppgave 7: Få ett spørsmål med svar og opprør

Først definerer vi et forhold mellom svar og opprør. Et svar har mange oppvoter, så forholdet er en til mange.

Så legger vi til følgende funksjon i vår svarmodell:

hasMany ( '\ \ modeller Upvote'); 

Deretter i spørsmålskontrolleren lager vi funksjonen for å få dette:

svar () -> ( 'med upvotes') -> får () -> toArray (); returnere $ spørsmål; 

Som i tidligere trinn, kommenterer vi alle andre anrop til index.php og kjører dette:

$ one_question = Spørsmål :: get_question_answers_upvotes (1);

Vi kan skrive ut $ one_question variabel for å se resultatene.

Oppgave 8: Telle alle spørsmål av en bestemt bruker

Først importerer vi spørsmålet modellen i brukerne kontrollører:

bruk modeller \ spørsmål;

Så skriver vi denne funksjonen:

telle(); returner $ count; 

I index.php kommenterer vi andre samtaler og legger til denne linjen:

$ user_question_count = Brukere :: question_count (1);

Dette returnerer et heltall som er antall spørsmål som er lagt til av en bruker med ID 1. 

Vi kan skrive ut $ user_question_count variabel og kjøre index.php for å se resultatene.

Oppgave 9: Oppdater svar av bruker

Begrepet oppdatering med Eloquent ORM er ganske enkelt. Først finner vi en plate, og vi muterer og lagrer.

Nå, i svarkontrollene, legger vi til denne funksjonen:

svar = $ new_answer; $ updated = $ answer-> save (); returner $ oppdatert; 

I index.php kan vi kommentere alle andre samtaler, og oppdatere svar med ID 1 slik:

$ update_answer = Svar :: update_answer (1, "Dette er et oppdatert svar");

Dette returnerer en boolsk verdi-sann-hvis oppdateringen er vellykket.

Oppgave 10: Slett et spørsmål (Soft Delete)

I denne siste oppgaven vil vi implementere Eloquent SoftDelete.

Først forteller vi spørsmålet modellen å bruke SoftDeletes ved å importere SoftDeletes namespace, og deretter bruke SoftDeletes trekk i vår klasse.

bruk Illuminate \ Database \ Eloquent \ SoftDeletes;

Så legger du til denne linjen etter klassedeklarasjonslinjen:

bruk SoftDeletes;

Så legger vi til deleted_at til beskyttet $ datoer eiendom for modellen. Dette er de nødvendige trinnene. 

beskyttet $ dates = ['deleted_at'];

Vår spørsmålet modell ser nå slik ut:

hasMany ( '\ modellene \ Svar');  offentlig funksjon bruker () return $ this-> belongsTo ('\ Modeller \ User'); ?>

Da lager vi delete_question Fungerer i spørsmålskontrollen.

sletter (); returner $ slettet;  

Kjør i index.php:

$ delete = Spørsmål :: delete_question (1);

Gratulerer! Du har nettopp bygget en fullt funksjonell bakre ende med belyser og eloquent. Og vi måtte ikke skrive så mye kode for å oppnå alt dette.

Koden for denne opplæringen finner du på GitHub. 

Konklusjon

Lys også kommer med spørringsbyggeren som du kan bruke til enda mer komplekse databasespørsmål, og er definitivt noe du vil eksperimentere med og bruke i appen din.

Det eneste som mangler i den frittstående Illuminate Database, er databasemigrasjoner, som er en nydelig funksjon av Laravel, og Lumen, mikrorammen av Laravel. Du bør vurdere å bruke begge i appene dine for å få fordeler av de nyttige funksjonene de kommer med.

Du kan finne ut mer om Eloquent på den offisielle Eloquent Documentation Page.

referanser

  • Lys opp databasen på GitHub
  • Eloquent ORM-dokumenter