Professional Documents
Culture Documents
SEARCH 5.8 ☰
Eloquent: Commencer
# introduction
# Définir des modèles
# Conventions modèles éloquentes
# Valeurs d'attribut par défaut
# Récupérer des modèles
# Des collections
# Résultats tronqués
# Récupération de modèles uniques / agrégats
# Récupération des agrégats
# Insertion et mise à jour de modèles
# Inserts
# Mises à jour
# Affectation de masse
# Autres méthodes de création
# Suppression de modèles
# Suppression douce
# Interrogation de modèles supprimés progressivement
# Portées de la requête
# Portées globales
# Portées locales
# Comparaison de modèles
# Événements
# Observateurs
# introduction
Eloquent ORM fourni avec Laravel fournit une belle et simple implémentation d'ActiveRecord pour
travailler avec votre base de données. Chaque table de base de données a un "Modèle" correspondant
qui est utilisé pour interagir avec cette table. Les modèles vous permettent de rechercher des données
dans vos tables, ainsi que d'insérer de nouveaux enregistrements dans la table.
Avant de commencer, assurez-vous de configurer une connexion de base de données dans . Pour plus
d'informations sur la configuration de votre base de données, consultez la documentation
. config/database.php
Le moyen le plus simple de créer une instance de modèle consiste à utiliser la commande Artisan
: make:model
Si vous souhaitez générer une migration de base de données lorsque vous générez le modèle, vous
pouvez utiliser l' option --migration ou -m :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
//
}
Noms de table
Notez que nous n'avons pas indiqué à Eloquent quelle table utiliser pour notre Flight modèle. Par
convention, le nom au pluriel "cas du serpent" de la classe sera utilisé comme nom de table sauf si un
autre nom est explicitement spécifié. Ainsi, dans ce cas, Eloquent supposera que le Flight modèle
stocke les enregistrements dans la flights table. Vous pouvez spécifier une table personnalisée en
définissant une table propriété sur votre modèle:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var string
*/
Clés primaires
Eloquent supposera également que chaque table a une colonne de clé primaire nommée id . Vous
pouvez définir une $primaryKey propriété protégée pour remplacer cette convention.
De plus, Eloquent suppose que la clé primaire est une valeur entière incrémentée, ce qui signifie que par
défaut, la clé primaire est convertie int automatiquement en une clé . Si vous souhaitez utiliser une clé
primaire non incrémentée ou non numérique, vous devez définir la $incrementing propriété publique de
votre modèle sur false . Si votre clé primaire n'est pas un entier, vous devez définir la
$keyType propriété protected sur votre modèle string .
Horodatage
Par défaut, Eloquent s'attend à ce created_at que des updated_at colonnes existent sur vos tables. Si
vous ne souhaitez pas que ces colonnes soient gérées automatiquement par Eloquent, définissez la
$timestamps propriété de votre modèle sur false :
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var bool
*/
Si vous devez personnaliser le format de vos horodatages, définissez la $dateFormat propriété sur votre
modèle. Cette propriété détermine la manière dont les attributs de date sont stockés dans la base de
données, ainsi que leur format lorsque le modèle est sérialisé en tableau ou en JSON:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var string
*/
Si vous devez personnaliser les noms des colonnes utilisées pour stocker les horodatages, vous pouvez
définir les constantes CREATED_AT et UPDATED_AT dans votre modèle:
<?php
{
const CREATED_AT = 'creation_date';
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var string
*/
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* The model's default values for attributes.
* @var array
*/
protected $attributes = [
];
<?php
$flights = App\Flight::all();
echo $flight->name;
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();
Les modèles Eloquent étant des générateurs de requêtes, vous devez revoir toutes les
méthodes disponibles dans le générateur de requêtes . Vous pouvez utiliser l'une de ces
méthodes dans vos requêtes Eloquent.
Modèles rafraîchissants
Vous pouvez actualiser les modèles à l'aide des méthodes fresh et refresh . La fresh méthode
récupérera le modèle de la base de données. L'instance de modèle existante ne sera pas affectée:
$freshFlight = $flight->fresh();
$flight->refresh();
Des collections
Pour les méthodes Eloquent telles que all et get qui récupèrent plusieurs résultats, une instance de
sera retournée. La classe fournit une variété de méthodes utiles pour travailler avec vos résultats
Eloquent: Illuminate\Database\Eloquent\Collection Collection
return $flight->cancelled;
});
echo $flight->name;
Résultats tronqués
Si vous devez traiter des milliers d'enregistrements Eloquent, utilisez la chunk commande. La
chunk méthode récupérera un "bloc" de modèles Eloquent, les alimentant à une donnée Closure à
traiter. L'utilisation de cette chunk méthode vous permettra d'économiser de la mémoire lorsque vous
travaillerez avec de grands ensembles de résultats:
//
});
Le premier argument transmis à la méthode est le nombre d'enregistrements que vous souhaitez
recevoir par "morceau". La fermeture passée en tant que deuxième argument sera appelée pour chaque
bloc extrait de la base de données. Une requête de base de données sera exécutée pour extraire chaque
bloc d'enregistrements transmis à la fermeture.
Utilisation de curseurs
La cursor méthode vous permet de parcourir les enregistrements de votre base de données à l'aide
d'un curseur, qui n'exécutera qu'une seule requête. Lors du traitement de grandes quantités de
données, la cursor méthode peut être utilisée pour réduire considérablement votre utilisation de la
mémoire:
//
$flight = App\Flight::find(1);
Vous pouvez également appeler la find méthode avec un tableau de clés primaires, qui renverront une
collection des enregistrements correspondants:
$flights = App\Flight::find([1, 2, 3]);
Exceptions Introuvables
Parfois, vous souhaiterez peut-être lancer une exception si aucun modèle n’est trouvé. Ceci est
particulièrement utile dans les routes ou les contrôleurs. Les méthodes findOrFail et firstOrFail vont
récupérer le premier résultat de la requête; Cependant, si aucun résultat n'est trouvé, un sera
lancé: Illuminate\Database\Eloquent\ModelNotFoundException
$model = App\Flight::findOrFail(1);
Si l'exception n'est pas interceptée, une 404 réponse HTTP est automatiquement renvoyée à
l'utilisateur. Il n'est pas nécessaire d'écrire des vérifications explicites pour renvoyer les 404 réponses
lors de l'utilisation de ces méthodes:
return App\Flight::findOrFail($id);
});
Inserts
To create a new record in the database, create a new model instance, set attributes on the model, then
call the save method:
<?php
namespace App\Http\Controllers;
use App\Flight;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
/**
* @return Response
*/
$flight->name = $request->name;
$flight->save();
In this example, we assign the name parameter from the incoming HTTP request to the name attribute
of the App\Flight model instance. When we call the save method, a record will be inserted into the
database. The created_at and updated_at timestamps will automatically be set when the save
method is called, so there is no need to set them manually.
Updates
The save method may also be used to update models that already exist in the database. To update a
model, you should retrieve it, set any attributes you wish to update, and then call the save method.
Again, the updated_at timestamp will automatically be updated, so there is no need to manually set its
value:
$flight = App\Flight::find(1);
$flight->save();
Mass Updates
Updates can also be performed against any number of models that match a given query. In this
example, all flights that are active and have a destination of San Diego will be marked as delayed:
App\Flight::where('active', 1)
The update method expects an array of column and value pairs representing the columns that should
be updated.
Lors de la publication d'une mise à jour en masse via Eloquent, les événements saved et
updated modèles ne sont pas déclenchés pour les modèles mis à jour. En effet, les modèles
ne sont jamais réellement récupérés lors de la mise à jour en masse.
Affectation de masse
Vous pouvez également utiliser cette create méthode pour enregistrer un nouveau modèle sur une
seule ligne. L'instance de modèle insérée vous sera renvoyée par la méthode. Cependant, avant de le
faire, vous devrez spécifier un attribut fillable ou un guarded attribut sur le modèle, car tous les
modèles Eloquent protègent contre les affectations en masse par défaut.
Une vulnérabilité d’assignation en masse se produit lorsqu'un utilisateur transmet un paramètre HTTP
inattendu via une demande et que ce paramètre modifie une colonne de votre base de données
inattendue. Par exemple, un utilisateur malveillant peut envoyer un is_admin paramètre via une requête
HTTP, qui est ensuite transmise à la create méthode de votre modèle , permettant ainsi à l'utilisateur
de se faire passer pour un administrateur.
Donc, pour commencer, vous devez définir les attributs de modèle que vous souhaitez rendre
assignables en masse. Vous pouvez le faire en utilisant la $fillable propriété sur le modèle. Par
exemple, assignons l' name attribut de notre Flight modèle en masse:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var array
*/
Une fois que les attributs ont été assignés en masse, vous pouvez utiliser la create méthode pour
insérer un nouvel enregistrement dans la base de données. La create méthode retourne l'instance de
modèle enregistrée:
Si vous avez déjà une instance de modèle, vous pouvez utiliser la fill méthode pour la remplir avec un
tableau d'attributs:
Attributs de garde
Tandis que $fillable sert comme une "liste blanche" d'attributs qui devraient être assignables en
masse, vous pouvez également choisir d'utiliser $guarded . La $guarded propriété doit contenir un
tableau d'attributs que vous ne souhaitez pas affecter en masse. Tous les autres attributs ne figurant
pas dans le tableau seront assignables en masse. Donc, $guarded fonctionne comme une "liste noire".
De manière importante, vous devez utiliser l'un $fillable ou l' autre ou $guarded pas les deux. Dans
l'exemple ci-dessous, tous les attributs sauf pour price seront assignables en masse:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @var array
*/
Si vous souhaitez rendre tous les attributs assignables en masse, vous pouvez définir la
$guarded propriété comme un tableau vide:
/**
* @var array
*/
firstOrCreate / firstOrNew
There are two other methods you may use to create models by mass assigning attributes:
firstOrCreate and firstOrNew . The firstOrCreate method will attempt to locate a database record
using the given column / value pairs. If the model can not be found in the database, a record will be
inserted with the attributes from the first parameter, along with those in the optional second
parameter.
The firstOrNew method, like firstOrCreate will attempt to locate a record in the database matching
the given attributes. However, if a model is not found, a new model instance will be returned. Note that
the model returned by firstOrNew has not yet been persisted to the database. You will need to call
save manually to persist it:
// Retrieve flight by name, or create it with the name, delayed, and arrival time attributes...
// Retrieve flight by name, or create it with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrCreate(
);
// Retrieve by name, or instantiate with the name, delayed, and arrival_time attributes...
$flight = App\Flight::firstOrNew(
);
updateOrCreate
Vous pouvez également rencontrer des situations dans lesquelles vous souhaitez mettre à jour un
modèle existant ou créer un nouveau modèle s'il n'en existe aucun. Laravel fournit une
updateOrCreate méthode pour le faire en une étape. Comme la firstOrCreate méthode,
// If there's a flight from Oakland to San Diego, set the price to $99.
$flight = App\Flight::updateOrCreate(
);
# Suppression de modèles
Pour supprimer un modèle, appelez la delete méthode sur une instance de modèle:
$flight = App\Flight::find(1);
$flight->delete();
modèle sans le récupérer en appelant la destroy méthode. En plus d'une clé primaire unique comme
argument, la destroy méthode acceptera plusieurs clés primaires, un tableau de clés primaires ou une
collection de clés primaires:
App\Flight::destroy(1);
App\Flight::destroy(1, 2, 3);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(collect([1, 2, 3]));
Lors de l'exécution d'une instruction de suppression en masse via Eloquent, les événements
deleting et les deleted modèles ne sont pas déclenchés pour les modèles supprimés. En
effet, les modèles ne sont jamais réellement récupérés lors de l'exécution de l'instruction
delete.
Suppression douce
En plus de supprimer les enregistrements de votre base de données, Eloquent peut également
"supprimer en douceur" les modèles. Lorsque les modèles sont supprimés, ils ne sont pas réellement
supprimés de votre base de données. Au lieu de cela, un deleted_at attribut est défini sur le modèle et
inséré dans la base de données. Si un modèle a une deleted_at valeur non NULL , le modèle a été
supprimé manuellement. Pour activer les suppressions douces pour un modèle, utilisez le trait sur le
modèle: Illuminate\Database\Eloquent\SoftDeletes
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use SoftDeletes;
Vous devez également ajouter la deleted_at colonne à votre table de base de données. Le constructeur
de schéma Laravel contient une méthode d'assistance pour créer cette colonne:
$table->softDeletes();
});
Désormais, lorsque vous appelez la delete méthode sur le modèle, la deleted_at colonne est définie
sur la date et l'heure actuelles. De plus, lorsque vous interrogez un modèle utilisant des suppressions
logicielles, les modèles supprimés seront automatiquement exclus de tous les résultats de la requête.
Pour déterminer si une instance de modèle donnée a été supprimée à l'aide d'un logiciel, utilisez la
trashed méthode suivante:
if ($flight->trashed()) {
//
->where('account_id', 1)
->get();
La withTrashed méthode peut également être utilisée sur une requête de relation :
$flight->history()->withTrashed()->get();
$flights = App\Flight::onlyTrashed()
->where('airline_id', 1)
->get();
$flight->restore();
Vous pouvez également utiliser la restore méthode dans une requête pour restaurer rapidement
plusieurs modèles. De nouveau, comme pour les autres opérations "en masse", cela ne déclenchera
aucun événement de modèle pour les modèles restaurés:
App\Flight::withTrashed()
->where('airline_id', 1)
->restore();
Comme la withTrashed méthode, la restore méthode peut également être utilisée sur des relations :
$flight->history()->restore();
$flight->forceDelete();
$flight->history()->forceDelete();
# Portées de la requête
Portées globales
Les étendues globales vous permettent d'ajouter des contraintes à toutes les requêtes pour un modèle
donné. La fonctionnalité de suppression logicielle propre à Laravel utilise des étendues globales pour
extraire uniquement les modèles "non supprimés" de la base de données. L'écriture de vos propres
domaines globaux peut constituer un moyen pratique et simple de s'assurer que chaque requête d'un
modèle donné reçoit certaines contraintes.
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
/**
*/
Si votre portée globale ajoute des colonnes à la clause select de la requête, vous devez utiliser
la addSelect méthode à la place de select . Cela empêchera le remplacement involontaire
de la clause select existante de la requête.
<?php
namespace App;
use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;
/**
* @return void
*/
parent::boot();
static::addGlobalScope(new AgeScope);
Après avoir ajouté l'étendue, une requête produira le code SQL suivant: User::all()
select * from `users` where `age` > 200
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
/**
* @return void
*/
parent::boot();
});
argument:
User::withoutGlobalScope(AgeScope::class)->get();
Si vous souhaitez supprimer plusieurs, voire toutes les étendues globales, vous pouvez utiliser la
withoutGlobalScopes méthode suivante:
User::withoutGlobalScopes()->get();
User::withoutGlobalScopes([
FirstScope::class, SecondScope::class
])->get();
Portées locales
Les étendues locales vous permettent de définir des ensembles communs de contraintes que vous
pouvez facilement réutiliser dans votre application. Par exemple, vous devrez peut-être extraire
fréquemment tous les utilisateurs considérés comme "populaires". Pour définir une portée, préfixez une
méthode de modèle Eloquent avec scope .
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @return \Illuminate\Database\Eloquent\Builder
*/
}
/**
* @return \Illuminate\Database\Eloquent\Builder
*/
$users = App\User::popular()->active()->orderBy('created_at')->get();
$query->active();
})->get();
Cependant, étant donné que cela peut être fastidieux, Laravel fournit une orWhere méthode "d'ordre
supérieur" qui vous permet de chaîner facilement ces étendues sans utiliser de Closures:
$users = App\User::popular()->orWhere->active()->get();
Portées dynamiques
Parfois, vous voudrez peut-être définir une étendue qui accepte les paramètres. Pour commencer,
ajoutez simplement vos paramètres supplémentaires à votre portée. Les paramètres de portée doivent
être définis après le $query paramètre:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
/**
* @return \Illuminate\Database\Eloquent\Builder
*/
Maintenant, vous pouvez passer les paramètres lorsque vous appelez la portée:
$users = App\User::ofType('admin')->get();
# Comparaison de modèles
Parfois, vous devrez peut-être déterminer si deux modèles sont "identiques". La is méthode peut être
utilisée pour vérifier rapidement que deux modèles ont la même clé primaire, table et connexion à la
base de données:
if ($post->is($anotherPost)) {
//
# Événements
Modèles Eloquent feu plusieurs événements, vous permettant de connecter le du cycle de vie d'un
modèle des points suivants: retrieved , creating , created , updating , updated , saving , saved ,
deleting , deleted , restoring , restored . Les événements vous permettent d'exécuter facilement du
code chaque fois qu'une classe de modèle spécifique est enregistrée ou mise à jour dans la base de
données. Chaque événement reçoit l'instance du modèle via son constructeur.
L' retrieved événement se déclenchera lorsqu'un modèle existant est extrait de la base de données.
Lorsqu'un nouveau modèle est enregistré pour la première fois, les événements creating et created se
déclenchent. Si un modèle existait déjà dans la base de données et que la save méthode est appelée,
les événements updating / updated seront déclenchés. Cependant, dans les deux cas, les événements
saving / saved seront déclenchés.
Lors de la publication d'une mise à jour en masse via Eloquent, les événements saved et
updated modèles ne sont pas déclenchés pour les modèles mis à jour. En effet, les modèles
ne sont jamais réellement récupérés lors de la mise à jour en masse.
Pour commencer, définissez une $dispatchesEvents propriété sur votre modèle Eloquent qui mappe
divers points du cycle de vie du modèle Eloquent avec vos propres classes d'événement :
<?php
namespace App;
use App\Events\UserSaved;
use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Notifiable;
/**
* @var array
*/
protected $dispatchesEvents = [
Après avoir défini et mappé vos événements Eloquent, vous pouvez utiliser des écouteurs d’événements
pour gérer les événements.
Observateurs
Cette commande placera le nouvel observateur dans votre répertoire. Si ce répertoire n'existe pas,
Artisan le créera pour vous. Votre nouvel observateur ressemblera à ceci: App/Observers
<?php
namespace App\Observers;
use App\User;
class UserObserver
/**
* @return void
*/
//
}
/**
* @return void
*/
//
/**
* @return void
*/
//
To register an observer, use the observe method on the model you wish to observe. You may register
observers in the boot method of one of your service providers. In this example, we'll register the
observer in the AppServiceProvider :
<?php
namespace App\Providers;
use App\User;
use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;
/**
* @return void
*/
User::observe(UserObserver::class);
/**
* @return void
*/
//
L A R A V E L I S A T R A D E M A R K O F T AY L O R O T W E L L . C O P Y R I G H T © T AY L O R O T W E L L .
DESIGNED BY