Illuminate-database gebruiken met enthousiaste in uw PHP-app zonder Laravel

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.

Project afhankelijkheden 

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

App-mogelijkheden

Onze app zal tien taken uitvoeren:

  • Voeg een gebruiker toe.
  • Voeg een vraag toe.
  • Voeg een antwoord op een vraag toe. 
  • Geef antwoord.
  • Krijg een vraag met antwoorden.
  • Krijg alle vragen en gebruikers die ze hebben gesteld.
  • Krijg specifieke vragen, antwoorden en upvotes.
  • Tel vragen van een bepaalde gebruiker.
  • Update antwoord per gebruiker.
  • Een vraag verwijderen.

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 en updated_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. De deleted_at tijdstempel werkt echter anders. Eloquent heeft een zachte wisfunctie die de deleted_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:

  • project_folder / app / modellen / question.php
  • project_folder / app / modellen / answer.php
  • project_folder / app / modellen / upvote.php
  • project_folder / app / modellen / user.php
  • project_folder / app / modellen / database.php
  • project_folder / app / controllers / questions.php
  • project_folder / app / controllers / answers.php
  • project_folder / app / controllers / upvotes.php
  • project_folder / app / controllers / users.php

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 de beschermde $ 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 of print_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 van SoftDeletes naamruimte en vervolgens de SoftDeletes 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 de beschermde $ 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

  • Verlicht Database op GitHub
  • Eloquent ORM-documenten