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 een Cat model hebben
  • Een jungle_cats tafel zou een JungleCat model hebben
  • Een users zou een User
  • Een people tafel zou hebben Person 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

Welsprekende relatie

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 en except 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 en deleted 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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow