Illuminate is Laravel's database-engine minus Laravel. Het komt gebundeld met de Weldadige ORM in Laravel. Als je je PHP-apps wilt bouwen met ORM's en Laravel liever niet gebruikt, is deze zelfstudie iets voor jou.
In deze tutorial gaan we de back-end bouwen voor een Q & A-app met PHP, Illuminate Database en de Weldadige ORM.
Onze app zal tien taken uitvoeren:
Eerst maken we onze projectdirectory en -structuur aan.
In de hoofdprojectdirectory maken we een app map en in deze app-map maken we twee mappen:modellen en controllers. In deze afbeelding is onze hoofdprojectmap welsprekend genoemd. Je moet het vervangen door elke gewenste naam.
Vervolgens maken we een index.php bestand in de hoofdprojectmap, op hetzelfde niveau als de app map.
We zullen git gebruiken, dus we maken een .gitignore-bestand. Merk op dat deze stap optioneel is.
Vervolgens installeren we de afhankelijkheden die nodig zijn om dit project te laten werken. In de hoofdmap van het project maken we een composer.json-bestand. Plak dit dan in ons composer.json-bestand.
"Naam": "illuminate-example / eloquent", "description": "Implementatie van databasequery's met illuminate en Weldadig", "type": "project", "require":
Om de Illuminate-database te installeren, voegen we dit toe aan onze composer.json:"Illuminate / database": "5.1.8",
.
Vervolgens voegen we psr-4 autoloading toe voor onze modellen en controllers:
"Autoload": "psr-4": "Controllers \\": "app / controllers /", "Models \\": "app / models /"
Nu zou ons composer.json-bestand er als volgt uit moeten zien:
"Naam": "illuminate-example / eloquent", "description": "Implementatie van databasequery's met illuminate en Weldadig", "type": "project", "require": "illuminate / database": "5.1. 8 "," autoload ": " psr-4 ": " Controllers \\ ":" app / controllers / "," Models \\ ":" app / models / "
We zullen nu deze twee componeeropdrachten uitvoeren op dezelfde locatie als ons bestand composer.json:
componist installeer componist dump-autoload -o
Dit genereert een leveranciersmap die we kunnen toevoegen aan gitignore (dit is ook een optionele stap).
Laten we een configuratiebestand toevoegen voor onze databasereferenties.
In de hoofdprojectdirectory maken we een bestand met de naam config.php en definiëren DB-details in het bestand Config.php. Merk op dat de waarden moeten worden vervangen door uw eigen verbindingsdetails.
Vervolgens maken we het schema voor onze app.
Een ding om op te merken voordat we het schema voor de tabellen in onze database maken, is dat we tijdstempels aan ons schema kunnen toevoegen.
De winnende ORM verwacht twee tijdstempelkolommen als we tijdstempelbewerking op een bepaalde tabel / model willen inschakelen. Zij zijn de
gemaakt bij
enupdated_at
kolommen. Als we tijdstempels voor een model inschakelen, worden deze velden door Eloyquent automatisch bijgewerkt met de tijd wanneer we een record maken of bijwerken.Er is een derde kolom genaamd
deleted_at
. Dedeleted_at
tijdstempel werkt echter anders. Eloquent heeft een zachte wisfunctie die dedeleted_at
kolom om te bepalen of een record is verwijderd. Als u een record verwijdert met de welsprekende functie 'Verwijderen' en Soft Delete inschakelt, wordt de kolom bijgewerkt met de tijd van verwijdering. Deze verwijderde items kunnen vervolgens op elk gewenst moment worden opgehaald.In deze app maken we gebruik van de tijdstempels, dus we gebruiken ze alle drie in onze Schema-creatie.
Maak tabellen met de volgende opdrachten in MySQL:
vragen
MAAK TABLE 'questions' ('id' int (11) unsigned NOT NULL AUTO_INCREMENT, 'question' tinytext, 'user_id' int (11) DEFAULT NULL, 'created_at' timestamp NULL DEFAULT NULL, 'updated_at' timestamp NULL DEFAULT NULL, ' deleted_at 'timestamp NULL DEFAULT NULL, PRIMARY KEY (' id ')) ENGINE = InnoDB DEFAULT CHARSET = utf8;antwoorden
CREËER TAFEL 'antwoorden' ('id' int (11) niet ondertekend NIET NULL AUTO_INCREMENT, 'antwoord' tinytext, 'user_id' int (11) DEFAULT NULL, 'question_id' int (11) DEFAULT NULL, 'created_at' timestamp NULL DEFAULT NULL , 'updated_at' timestamp NULL DEFAULT NULL, 'deleted_at' timestamp NULL DEFAULT NULL, PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;upvotes
CREATE TABLE 'upvotes' ('id' int (11) unsigned NOT NULL AUTO_INCREMENT, 'answer_id' int (11) DEFAULT NULL, 'user_id' int (11) DEFAULT NULL, 'created_at' timestamp NULL DEFAULT NULL, 'updated_at' timestamp NULL DEFAULT NULL, 'deleted_at' timestamp NULL DEFAULT NULL, PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8;gebruikers
MAKEN TAFEL 'users' ('id' int (11) unsigned NOT NULL AUTO_INCREMENT, 'gebruikersnaam' varchar (100) DEFAULT NULL, 'email' varchar (200) DEFAULT NULL, 'wachtwoord' varchar (200) DEFAULT NULL, 'created_at 'timestamp NULL DEFAULT NULL,' updated_at 'timestamp NULL DEFAULT NULL,' deleted_at 'timestamp NULL DEFAULT NULL, PRIMARY KEY (' id ')) ENGINE = InnoDB DEFAULT CHARSET = utf8;We gaan door met het maken van bestanden voor modellen en controllers voor onze tabellen op de volgende locaties:
Open modellen / database.php met een editor.
Eerst maken we de Capsule:
addConnection (['driver' => DBDRIVER, 'host' => DBHOST, 'database' => DBNAME, 'gebruikersnaam' => DBUSER, 'wachtwoord' => DBPASS, 'charset' => 'utf8', 'collatie' => 'utf8_unicode_ci', 'prefix' => ",]); // Stel de uitbundige ORM in ... $ capsule-> bootEloquent ();
In het bovenstaande bestand initialiseren en stellen we de capsule in met de constanten gedefinieerd in config.php, en dan starten we welsprekend op.
De volgende stap is het maken van een startscript. Dit zal een bestand zijn waar alles wat moet worden uitgevoerd voordat onze app werkt, wordt uitgevoerd.
We maken een startbestand op de locatie project_folder / start.php, en dan in het bestand het autoload-bestand van de Composer nodig hebben:
vereisen 'vendor / autoload.php';
Daarna hebben we nodig config.php om de referenties gedefinieerd te krijgen: vereisen 'config.php';
Vervolgens initialiseren we de database-klasse.
Uw start.php zou er als volgt uit moeten zien:
Voeg start.php toe aan uw index.php omdat dit ons hoofdbestand is.
Ons index.php-bestand ziet er nu als volgt uit:
Vervolgens kunnen we aan onze controllers en modellen gaan werken. In project folder/ App /modellen / question.php, we voegen dit toe:
Dan in project folder/app/controllers/questions.php:
In project folder/app/controllers/answers.php, we doen hetzelfde:
Taak 1: een gebruiker toevoegen
In het gebruikersmodel (project folder/app/models/user.php), we voegen de volgende code toe om onze namespace te definiëren, het Welsprekende Model uit te breiden en de tabelnaam te definiëren (
beschermde $ tafel
) en welke velden in de tabellen kunnen worden ingevuld door massacreatie (beschermde $ vulbaar
).In de gebruikerscontroller (project folder/app/controllers/user.php), definiëren we onze naamruimte en klasse zoals gewoonlijk:
Om vervolgens een gebruiker te maken, importeren we in de gebruikerscontroller de gebruikersmodelnaamruimte,
gebruik Modellen \ Gebruiker;
, en voeg vervolgens een functie toe om de gebruiker te maken.$ Username, 'email' => $ email, 'password' => $ password]); return $ user;Onze gebruikerscontroller ziet er nu zo uit.
$ Username, 'email' => $ email, 'password' => $ password]); return $ user; ?>Vervolgens voegen we in index.php deze regels toe en voert de app uit om een nieuwe gebruiker te maken.
Taak 2: een vraag toevoegen
Om een vraag toe te voegen, importeren we de vraagmodel-naamruimte in de vragen-controller en schrijven we een
create_question
functie:
gebruik Modellen \ Vraag;
Dan:
$ Vraag, 'user_id' => $ user_id]); return $ vraag;We hebben Eloquent massacreatiemodellen gebruikt om dit record in te voegen, maar voordat het werkt, moeten we toestaan dat die velden invulbaar zijn, omdat Eloquent-modellen standaard tegen massacreatie waken..
Dus we gaan naar de
vraag
model en voeg debeschermde $ vulbaar
eigendom van de klas.
beschermd $ fillable = ['vraag', 'user_id'];
Om dit uit te voeren, importeert u de vragen-controller in index.php en belt u de
create_question
functioneel statisch:
gebruik Controllers \ Question;
Maak vervolgens een vraag met een vraag en gebruikers-ID als parameters:
$ question = Questions :: create_question ("Heb je je dubbelganger wel eens ontmoet?", 1);
Hiermee wordt een modelobject geretourneerd als dit lukt.
We zullen nu het index.php-script met verschillende items uitvoeren om meer vragen aan de database toe te voegen.
Taak 3: een antwoord op een vraag toevoegen
In het antwoordmodel herhalen we de stappen voor vraag en gebruikersmodellen door de onderstaande code toe te voegen:
Vervolgens schrijven we in de antwoordencontroller deze regels:
$ answer, 'question_id' => $ question_id, 'user_id' => $ user_id]); return $ antwoord; ?>Vervolgens kunnen we in index.php een antwoord maken voor de vraag met id 1 die we eerder hebben toegevoegd, met gebruikers-ID 2. Vergeet niet om eerst de antwoordencontroller te importeren naar index.php.
Om meerdere vermeldingen te voorkomen, becommentarieer alle andere aanroepen in index.php voordat u een nieuwe uitvoert.
Taak 4: een antwoord opwaarts stemmen
Dit zijn vrijwel dezelfde stappen als we gewend zijn.
Dus we kopiëren dit naar het Upvote-model op project folder/ App /modellen / upvote.php.
Vervolgens importeren we in de answer-controllers de Upvote Model-naamruimte.
gebruik Modellen \ Upvote;
Vervolgens maken we een
upvote_answer
functie.$ Answer_id, 'user_id' => $ user_id]); $ upvote teruggeven;In index.php kunnen we de functie met een dummy gebruikers-ID oproepen om het antwoord met id 1 over te halen.
$ upvote = Antwoorden :: upvote_answer (1,14);
Taak 5: krijg een vraag met antwoorden
Voor taken als deze kunnen we Eloquent-relaties gebruiken.
Typen relaties omvatten één op één, één op veel, veel op veel, enzovoort.
Bij het gebruik van deze relaties neemt Eloquent een externe sleutel in de vorm aan modelnaam_id bestaat op de modellen. Voor deze taak is de relatie een een-op-veelrelatie omdat een enkele vraag elk aantal antwoorden kan bevatten.
Eerst definiëren we deze relatie door deze functie aan ons vraagmodel toe te voegen.
hasMany ( '\ Models \ Antwoord');Vervolgens schrijven we in de vragencontroller een functie om vragen met antwoorden te krijgen.
te krijgen () -> toArray (); keer $ vragen terug;Hiermee worden de vragen opgehaald met de bijbehorende antwoorden.
In index.php geven we commentaar op alle andere oproepen en voeren we uit:
$ all = Vragen :: get_questions_with_answers ();
We kunnen
var_dump
ofprint_r
de$ all
variabele om de resultaten te zien.Taak 6: Krijg alle vragen en gebruikers die ze hebben gesteld
Dit is een één-op-één relatie omdat één vraag één gebruiker heeft, dus voegen we deze toe aan het vraagmodel.
belongsTo ( '\ Models \ User');Vervolgens maken we een functie in de vragencontroller en gebruiken we de
met
functie op het vraagmodel.te krijgen () -> toArray (); keer $ vragen terug;Geef in index.php commentaar op alle anderen en voer dit uit:
$ all_with_users = Vragen :: get_questions_with_users ();
Taak 7: Krijg één vraag met antwoorden en upvotes
Eerst definiëren we een relatie tussen antwoorden en upvotes. Een antwoord heeft veel upvotes, dus de relatie is er een te veel.
Dus voegen we de volgende functie toe aan ons antwoordmodel:
hasMany ( '\ Models \ Upvote');Vervolgens maken we in de vragencontroller de functie om dit te krijgen:
antwoorden () -> met ( 'upvotes') -> te krijgen () -> toArray (); keer $ vragen terug;Net als in de vorige stappen, becommentariëren we alle andere aanroep naar index.php en voeren dit uit:
$ one_question = Vragen :: get_question_answers_upvotes (1);
We kunnen de
$ one_question
variabele om de resultaten te zien.Taak 8: Tel alle vragen van een bepaalde gebruiker
Eerst importeren we het vraagmodel in de gebruikerscontrollers:
gebruik Modellen \ Vraag;
Vervolgens schrijven we deze functie:
optellen (); return $ count;In index.php becommentariëren we andere oproepen en voegen we deze regel toe:
$ user_question_count = Gebruikers :: question_count (1);
Dit retourneert een geheel getal, het aantal vragen dat is toegevoegd door een gebruiker met id 1.
We kunnen de
$ user_question_count
variabele en voer index.php uit om de resultaten te zien.Taak 9: Antwoord van gebruiker bijwerken
Het concept van bijwerken met de Welsprekende ORM is vrij eenvoudig. Eerst vinden we een record en daarna muteren en opslaan we.
In de controllers voor antwoorden voegen we nu deze functie toe:
answer = $ new_answer; $ updated = $ answer-> save (); return $ bijgewerkt;In index.php kunnen we alle andere oproepen becommentariëren en het antwoord met id 1 als volgt bijwerken:
$ update_answer = Antwoorden :: update_answer (1, "Dit is een bijgewerkt antwoord");
Dit retourneert een Booleaanse waarde-true-als de update is gelukt.
Taak 10: een vraag verwijderen (zachte verwijdering)
In deze laatste taak zullen we Eloquent SoftDelete implementeren.
Eerst vertellen we het te gebruiken vraagmodel
SoftDeletes
door het importeren vanSoftDeletes
naamruimte en vervolgens deSoftDeletes
eigenschap in onze klas.
gebruik Illuminate \ Database \ Eloquent \ SoftDeletes;
Daarna voegen we na de klasseaangiftelijn deze regel toe:
gebruik SoftDeletes;
Dan voegen we toe
deleted_at
naar debeschermde $ datums
eigendom voor het model. Dit zijn de vereiste stappen.
beschermde $ datums = ['deleted_at'];
Ons vraagmodel ziet er nu als volgt uit:
hasMany ( '\ Models \ Antwoord'); public function user () return $ this-> belongTo ('\ Models \ User'); ?>Vervolgens maken we de
delete_question
functie in de vragen-controller.verwijderen (); return $ verwijderd;Uitvoeren in index.php:
$ delete = Vragen :: delete_question (1);
Gefeliciteerd! Je hebt zojuist een volledig functionele back-end gebouwd met Illuminate en Eloyant. En we hoefden niet zoveel code te schrijven om dit alles te bereiken.
De code voor deze tutorial is te vinden op GitHub.
Conclusie
Illuminate komt ook met de Query Builder die u kunt gebruiken voor nog complexere databasequery's en is absoluut iets waarmee u wilt experimenteren en gebruiken in uw app.
Het enige wat ontbreekt in de standalone Illuminate-database zijn databasemigraties, een mooie eigenschap van Laravel, en Lumen, het microframe van Laravel. Overweeg beide in uw apps te gebruiken om de voordelen te benutten van de handige functies waarmee ze worden geleverd.
Je kunt meer over Welsprekend worden op de officiële website van de Eloquent-documentatie.
Referenties