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.
Vår app vil utføre ti oppgaver:
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
ogupdated_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
. Dedeleted_at
tidsstempel virker annerledes, skjønt. Eloquent har en myk slette evne som brukerdeleted_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:
Å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:
I 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 tilbeskyttet $ 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
ellerprint_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 å importereSoftDeletes
namespace, og deretter brukeSoftDeletes
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
tilbeskyttet $ 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