Szukaj…


Wprowadzenie

Eloquent to ORM (Object Relational Model) zawarty w Laravel. Implementuje aktywny wzorzec rekordów i służy do interakcji z relacyjnymi bazami danych.

Uwagi

Nazwy tabel

Konwencja polega na użyciu liczby mnogiej „snake_case” dla nazw tabel i pojedynczej „StudlyCase” dla nazw modeli. Na przykład:

  • Stolik dla cats miałby model Cat
  • Stół jungle_cats miałby model JungleCat
  • Tabela users miałaby model User
  • Stolik people miałby model Person

Eloquent automatycznie spróbuje powiązać model z tabelą, która ma liczbę mnogą nazwy modelu, jak podano powyżej.

Możesz jednak podać nazwę tabeli, aby zastąpić domyślną konwencję.

class User extends Model
{ 
    protected $table = 'customers';
}

Wprowadzenie

Eloquent to ORM wbudowany w środowisko Laravela. Umożliwia interakcję z tabelami bazy danych w sposób obiektowy, z wykorzystaniem wzorca ActiveRecord .

Pojedyncza klasa modelu zwykle jest odwzorowywana na pojedynczą tabelę bazy danych, a także zależności różnych typów (polimorficzne jeden do jednego , jeden do wielu , wiele do wielu ).

Sekcja Tworzenie modelu opisuje tworzenie i definicję klas modeli.

Zanim zaczniesz używać modeli Eloquent, upewnij się, że co najmniej jedno połączenie z bazą danych zostało skonfigurowane w pliku konfiguracyjnym config/database.php .

Aby zrozumieć użycie elokwentnego konstruktora zapytań podczas programowania, możesz użyć polecenia php artisan ide-helper:generate . Oto link .


Nawigacja podtematów

Elokwentny związek

Utrwalanie

Oprócz odczytu danych za pomocą Eloquent, możesz go również używać do wstawiania lub aktualizowania danych za pomocą metody save() . Jeśli utworzyłeś nową instancję modelu, rekord zostanie wstawiony ; w przeciwnym razie, jeśli pobrałeś model z bazy danych i ustawiłeś nowe wartości, zostanie on zaktualizowany .

W tym przykładzie tworzymy nowy rekord User :

$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();

Możesz także użyć metody create , aby wypełnić pola przy użyciu tablicy danych:

User::create([
    'first_name'=> 'John',
    'last_name' => 'Doe',
    'email'     => '[email protected]', 
    'password'  => bcrypt('changeme'),
]);

Podczas korzystania z metody tworzenia atrybuty należy zadeklarować w tablicy do fillable w modelu:

class User extends Model
{
    protected $fillable = [
         'first_name',
         'last_name',
         'email',
         'password',
    ];
}

Alternatywnie, jeśli chcesz przypisać wszystkie atrybuty masowo, możesz zdefiniować właściwość $ guarded jako pustą tablicę:

class User extends Model
{
    /**
    * The attributes that aren't mass assignable.
    *
    * @var array
    */
    protected $guarded = [];
}

Ale można też utworzyć rekord nawet zmieniający fillable atrybut w modelu za pomocą forceCreate metodę zamiast create metody

User::forceCreate([
    'first_name'=> 'John',
    'last_name' => 'Doe',
    'email'     => '[email protected]', 
    'password'  => bcrypt('changeme'),
]);

Poniżej znajduje się przykład aktualizacji istniejącego modelu User , najpierw ładując go (za pomocą find ), modyfikując go, a następnie zapisując:

$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();

Aby dokonać tego samego wyczynu za pomocą jednego wywołania funkcji, możesz użyć metody update :

$user->update([
    'password' => bcrypt('my_new_password'),
]);

Metody create i update sprawiają, że praca z dużymi zestawami danych jest znacznie prostsza niż konieczność ustawiania każdej pary klucz / wartość osobno, jak pokazano w poniższych przykładach:

Zwróć uwagę na użycie only except podczas zbierania danych żądania. Ważne jest, aby podać dokładne klucze, które chcesz zezwolić / nie zezwolić na aktualizację, w przeciwnym razie atakujący może wysłać dodatkowe pola z żądaniem i spowodować niezamierzone aktualizacje.

// 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);

Kasowanie

Możesz usunąć dane po zapisaniu ich w bazie danych. Możesz usunąć instancję modelu, jeśli ją pobrałeś, lub określić warunki, dla których rekordy mają zostać usunięte.

Aby usunąć instancję modelu, pobierz ją i wywołaj metodę delete() :

$user = User::find(1);
$user->delete();

Alternatywnie możesz określić klucz podstawowy (lub tablicę kluczy podstawowych) rekordów, które chcesz usunąć za pomocą metody destroy() :

User::destroy(1);
User::destroy([1, 2, 3]);

Możesz także łączyć zapytania z usuwaniem:

User::where('age', '<', 21)->delete();

Spowoduje to usunięcie wszystkich użytkowników, którzy spełniają warunek.

Uwaga: Podczas wykonywania instrukcji masowego usuwania za pomocą Eloquent, zdarzenia deleting i deleted modelu nie będą uruchamiane dla usuniętych modeli. Wynika to z faktu, że modele nigdy nie są pobierane podczas wykonywania instrukcji delete.

Miękkie usuwanie

Czasami nie chcesz trwale usuwać rekordu, ale przechowuj go do celów kontroli lub raportowania. W tym celu Eloquent zapewnia funkcję miękkiego usuwania .

Aby dodać funkcję miękkiego usuwania do swojego modelu, musisz zaimportować cechę SoftDeletes i dodać ją do klasy Eloquent:

namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
     use SoftDeletes;
}

Podczas usuwania modelu ustawi znacznik czasu w kolumnie znacznik czasu deleted_at w tabeli dla modelu, więc najpierw należy utworzyć kolumnę deleted_at w tabeli. Lub podczas migracji powinieneś wywołać softDeletes() na swoim planie, aby dodać znacznik czasu deleted_at . Przykład:

Schema::table('users', function ($table) {
    $table->softDeletes();
});

Wszelkie zapytania pomijają rekordy usunięte miękko. Możesz je wymusić, jeśli chcesz, używając zakresu withTrashed() :

User::withTrashed()->get();

Jeśli chcesz zezwolić użytkownikom na przywrócenie rekordu po miękkim usunięciu (tj. W obszarze typu kosza), możesz użyć metody restore() :

$user = User::find(1);
$user->delete();
$user->restore();

Aby forceDelete() usunięcie rekordu, użyj metody forceDelete() , która naprawdę usunie rekord z bazy danych:

$user = User::find(1);
$user->forceDelete();

Zmień klucz podstawowy i znaczniki czasu

Domyślnie Elokwentne modele oczekują, że klucz podstawowy zostanie nazwany 'id' . Jeśli tak nie jest, możesz zmienić nazwę klucza podstawowego, określając właściwość $primaryKey .

class Citizen extends Model
{
    protected $primaryKey = 'socialSecurityNo';

    // ...
}

Teraz wszelkie metody, które wykorzystują swój wymowny klucz podstawowy (np find lub findOrFail ) będzie wykorzystywać tę nową nazwę.

Ponadto Eloquent oczekuje, że klucz podstawowy będzie liczbą całkowitą z automatyczną inkrementacją. Jeśli klucz podstawowy nie jest liczbą całkowitą z automatyczną inkrementacją (np. GUID), musisz poinformować Eloquent poprzez zaktualizowanie właściwości $incrementing na false :

class Citizen extends Model
{
    protected $primaryKey = 'socialSecurityNo';

    public $incrementing = false;

    // ...
}

Domyślnie Eloquent oczekuje, że w tabelach będą updated_at kolumny created_at i updated_at . Jeśli nie chcesz, aby Eloquent automatycznie zarządzał tymi kolumnami, ustaw właściwość $timestamps w swoim modelu na false:

class Citizen extends Model
{
    public $timestamps = false;

    // ...
}

Jeśli chcesz dostosować nazwy kolumn używanych do przechowywania znaczników czasu, możesz ustawić CREATED_AT i UPDATED_AT w swoim modelu:

class Citizen extends Model
{
    const CREATED_AT = 'date_of_creation';
    const UPDATED_AT = 'date_of_last_update';

    // ...
}

Rzuć 404, jeśli nie znaleziono bytu

Jeśli chcesz automatycznie zgłosić wyjątek podczas wyszukiwania rekordu, którego nie ma w modalu, możesz użyć jednego z nich

Vehicle::findOrFail(1);

lub

Vehicle::where('make', 'ford')->firstOrFail();

Jeśli rekord z kluczem podstawowym 1 nie zostanie znaleziony, ModelNotFoundException zostanie ModelNotFoundException . Co jest zasadniczo takie samo jak pisanie ( zobacz źródło ):

$vehicle = Vehicle::find($id);

if (!$vehicle) {
    abort(404);
}

Klonowanie modeli

Być może będziesz musiał sklonować wiersz, może zmienić kilka atrybutów, ale potrzebujesz skutecznego sposobu na utrzymanie stanu SUCHEGO. Laravel zapewnia swego rodzaju „ukrytą” metodę, która umożliwia wykonanie tej funkcji. Chociaż jest to całkowicie nieudokumentowane, musisz przeszukać interfejs API, aby go znaleźć.

Za pomocą $model->replicate() możesz łatwo sklonować rekord

$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();

Powyższe znalazłoby robota o identyfikatorze 1, a następnie sklonowało go.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow