Zoeken…
Invoering
The Eloquent is een ORM (Object Relational Model) dat wordt meegeleverd met de Laravel. Het implementeert het actieve recordpatroon en wordt gebruikt om te communiceren met relationele databases.
Opmerkingen
Tabel naamgeving
De conventie is om meervoudig "snake_case" te gebruiken voor tabelnamen en enkelvoud "StudlyCase" voor modelnamen. Bijvoorbeeld:
- Een
cats
zou eenCat
model hebben - Een
jungle_cats
tafel zou eenJungleCat
model hebben - Een
users
zou eenUser
- Een
people
tafel zou hebbenPerson
model
Eloquent zal automatisch proberen uw model te binden met een tabel met het meervoud van de naam van het model, zoals hierboven vermeld.
U kunt echter een tabelnaam opgeven om de standaardconventie te overschrijven.
class User extends Model
{
protected $table = 'customers';
}
Invoering
Eloquent is de ORM ingebouwd in het Laravel-framework. Hiermee kunt u op een objectgerichte manier communiceren met uw databasetabellen, met behulp van het ActiveRecord- patroon.
Een enkele modelklasse wordt meestal toegewezen aan een enkele databasetabel, en ook relaties van verschillende typen ( één-op-één , één-op-veel , veel-op-veel , polymorf) kunnen tussen verschillende modelklassen worden gedefinieerd.
Sectie Maken van een model beschrijft het maken en definiëren van modelklassen.
Voordat u Eloquent-modellen kunt gebruiken, moet u ervoor zorgen dat ten minste één databaseverbinding is geconfigureerd in uw config/database.php
configuratiebestand.
Om het gebruik van welsprekende querybuilder tijdens de ontwikkeling te begrijpen, kunt u php artisan ide-helper:generate
opdracht php artisan ide-helper:generate
. Hier is de link .
Subonderwerp Navigatie
aanhoudende
Naast het lezen van gegevens met Eloquent, kunt u het ook gebruiken om gegevens in te voegen of bij te werken met de methode save()
. Als u een nieuwe modelinstantie hebt gemaakt, wordt de record ingevoegd ; anders wordt het bijgewerkt als u een model uit de database hebt opgehaald en nieuwe waarden hebt ingesteld.
In dit voorbeeld maken we een nieuw User
:
$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();
U kunt ook de methode create
gebruiken om velden te vullen met behulp van een reeks gegevens:
User::create([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Wanneer u de methode create gebruikt, moeten uw kenmerken worden opgegeven in de fillable
array in uw model:
class User extends Model
{
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
}
Als alternatief, als u alle attributen massaal toewijsbaar wilt maken, kunt u de $ guarded property definiëren als een lege array:
class User extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
}
Maar u kunt ook een record maken zonder zelfs het fillable
kenmerk in uw model te wijzigen met behulp van de forceCreate
methode in plaats van create
methode
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Het volgende is een voorbeeld van het bijwerken van een bestaand User
door het eerst te laden (met behulp van find
), het te wijzigen en vervolgens op te slaan:
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
Om dezelfde prestatie te bereiken met een enkele functie-aanroep, kunt u de update
gebruiken:
$user->update([
'password' => bcrypt('my_new_password'),
]);
De methoden voor create
en update
maken het werken met grote gegevenssets veel eenvoudiger dan dat elk sleutel / waarde-paar afzonderlijk moet worden ingesteld, zoals in de volgende voorbeelden:
Let op het gebruik van
only
enexcept
bij het verzamelen van aanvraaggegevens. Het is belangrijk dat u de exacte sleutels opgeeft die u wilt toestaan / weigeren om te worden bijgewerkt, anders is het voor een aanvaller mogelijk om extra velden met hun verzoek te verzenden en onbedoelde updates te veroorzaken.
// Updating a user from specific request data
$data = Request::only(['first_name', 'email']);
$user->find(1);
$user->update($data);
// Create a user from specific request data
$data = Request::except(['_token', 'profile_picture', 'profile_name']);
$user->create($data);
verwijderen
U kunt gegevens verwijderen nadat u deze naar de database hebt geschreven. U kunt een modelinstantie verwijderen als u deze hebt opgehaald, of voorwaarden opgeven waarvoor records moeten worden verwijderd.
Om een modelinstantie te verwijderen, haalt u deze op en roept u de methode delete()
:
$user = User::find(1);
$user->delete();
U kunt ook een primaire sleutel (of een reeks primaire sleutels) opgeven van de records die u wilt verwijderen via de methode destroy()
:
User::destroy(1);
User::destroy([1, 2, 3]);
U kunt query's ook combineren met verwijderen:
User::where('age', '<', 21)->delete();
Hiermee worden alle gebruikers verwijderd die overeenkomen met de voorwaarde.
Opmerking: Bij het uitvoeren van een massaverwijzingsopdracht via Eloquent, worden de
deleting
endeleted
modelgebeurtenissen niet geactiveerd voor de verwijderde modellen. Dit komt omdat de modellen nooit daadwerkelijk worden opgehaald bij het uitvoeren van de delete-opdracht.
Zacht verwijderen
Soms wilt u een record niet permanent verwijderen, maar bewaren voor controle- of rapportagedoeleinden. Hiervoor biedt Eloquent zachte verwijderingsfunctionaliteit .
Als u zachte verwijderingsfunctionaliteit aan uw model wilt toevoegen, moet u de SoftDeletes
eigenschap importeren en toevoegen aan uw Eloquent- SoftDeletes
:
namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
Bij het verwijderen van een model, zal het een tijdstempel op een vastgestelde deleted_at
timestamp kolom van de tabel voor uw model, dus zorg ervoor dat het creëren deleted_at
kolom in de tabel eerste. Of tijdens migratie moet u de methode softDeletes()
op uw blauwdruk deleted_at
om de tijdstempel deleted_at
toe te voegen. Voorbeeld:
Schema::table('users', function ($table) {
$table->softDeletes();
});
Query's laten zachte verwijderde records weg. Je kunt ze withTrashed()
tonen als je dat wilt met behulp van de withTrashed()
:
User::withTrashed()->get();
Als u gebruikers toestemming wilt geven om een record te herstellen na soft-delete (dwz in een prullenbak-type gebied), kunt u de methode restore()
gebruiken:
$user = User::find(1);
$user->delete();
$user->restore();
Om een record krachtig te verwijderen, gebruikt u de methode forceDelete()
die het record echt uit de database verwijdert:
$user = User::find(1);
$user->forceDelete();
Wijzig primaire sleutel en tijdstempels
Standaard verwachten Eloquent-modellen dat de primaire sleutel 'id'
. Als dat niet uw geval is, kunt u de naam van uw primaire sleutel wijzigen door de eigenschap $primaryKey
.
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
Nu zullen alle welsprekende methoden die uw primaire sleutel gebruiken (bijvoorbeeld find
of findOrFail
) deze nieuwe naam gebruiken.
Bovendien verwacht Eloquent dat de primaire sleutel een automatisch oplopend getal is. Als uw primaire sleutel geen automatisch oplopend getal is (bijvoorbeeld een GUID), moet u Eloquent hiervan op de hoogte stellen door de eigenschap $incrementing
bij te werken naar false
:
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
Standaard verwacht Eloquent dat de kolommen created_at
en updated_at
in uw tabellen voorkomen. Als u niet wilt dat deze kolommen automatisch door Eloquent worden beheerd, stelt u de eigenschap $timestamps
op uw model in op false:
class Citizen extends Model
{
public $timestamps = false;
// ...
}
Als u de namen van de kolommen moet aanpassen die worden gebruikt om de tijdstempels op te slaan, kunt u de constanten CREATED_AT
en UPDATED_AT
in uw model instellen:
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
Gooi 404 als entiteit niet gevonden
Als u automatisch een uitzondering wilt maken bij het zoeken naar een record dat niet op een modaal wordt gevonden, kunt u een van beide gebruiken
Vehicle::findOrFail(1);
of
Vehicle::where('make', 'ford')->firstOrFail();
Als een record met de primaire sleutel van 1
niet wordt gevonden, wordt een ModelNotFoundException
gegenereerd. Wat in wezen hetzelfde is als schrijven ( bron weergeven ):
$vehicle = Vehicle::find($id);
if (!$vehicle) {
abort(404);
}
Klonen Modellen
Misschien moet je een rij klonen, misschien een paar attributen veranderen, maar je hebt een efficiënte manier nodig om dingen DROOG te houden. Laravel biedt een soort 'verborgen' methode waarmee u deze functionaliteit kunt uitvoeren. Hoewel het volledig ongedocumenteerd is, moet u de API doorzoeken om het te vinden.
Met $model->replicate()
kunt u eenvoudig een record klonen
$robot = Robot::find(1);
$cloneRobot = $robot->replicate();
// You can add custom attributes here, for example he may want to evolve with an extra arm!
$cloneRobot->arms += 1;
$cloneRobot->save();
Het bovenstaande zou een robot vinden met een ID van 1 en deze vervolgens klonen.