Recherche…
Introduction
L'Eloquent est un ORM (Object Relational Model) inclus avec le Laravel. Il implémente le modèle d'enregistrement actif et est utilisé pour interagir avec des bases de données relationnelles.
Remarques
Nom de table
La convention est d'utiliser «snake_case» pluralisé pour les noms de tables et «StudlyCase» singulier pour les noms de modèles. Par exemple:
- Une table de
cats
aurait un modèleCat
- Une table
jungle_cats
aurait un modèleJungleCat
- Une table d'
users
aurait un modèle d'User
- Une table de
people
aurait un modèlePerson
Eloquent essaiera automatiquement de lier votre modèle avec une table qui a le pluriel du nom du modèle, comme indiqué ci-dessus.
Vous pouvez cependant spécifier un nom de table pour remplacer la convention par défaut.
class User extends Model
{
protected $table = 'customers';
}
introduction
Eloquent est l' ORM intégré dans le cadre Laravel. Il vous permet d'interagir avec vos tables de base de données de manière orientée objet, en utilisant le modèle ActiveRecord .
Une seule classe de modèle est généralement mappée sur une seule table de base de données et les relations de différents types ( un à un , un à plusieurs , plusieurs à plusieurs , polymorphes) peuvent être définies entre différentes classes de modèles.
Section Créer un modèle décrit la création et la définition des classes de modèle.
Avant de pouvoir utiliser les modèles Eloquent, assurez-vous qu'au moins une connexion à la base de données a été configurée dans votre fichier de configuration config/database.php
.
Pour comprendre l'utilisation du générateur de requêtes éloquent pendant le développement, vous pouvez utiliser la commande php artisan ide-helper:generate
. Voici le lien .
Sous-sujet Navigation
Persister
Outre la lecture des données avec Eloquent, vous pouvez également l'utiliser pour insérer ou mettre à jour des données avec la méthode save()
. Si vous avez créé une nouvelle instance de modèle, l'enregistrement sera inséré . sinon, si vous avez récupéré un modèle de la base de données et défini de nouvelles valeurs, il sera mis à jour .
Dans cet exemple, nous créons un nouvel enregistrement d' User
:
$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();
Vous pouvez également utiliser la méthode create
pour renseigner les champs à l'aide d'un tableau de données:
User::create([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Lorsque vous utilisez la méthode create, vos attributs doivent être déclarés dans le tableau fillable
de votre modèle:
class User extends Model
{
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
}
Si vous souhaitez que tous les attributs puissent être assignés en masse, vous pouvez également définir la propriété $ guarded comme un tableau vide:
class User extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
}
Mais vous pouvez également créer un enregistrement sans même changer l'attribut fillable
dans votre modèle en utilisant la méthode forceCreate
plutôt que de create
méthode
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Voici un exemple de mise à jour d'un modèle d' User
existant en le chargeant d'abord (en utilisant find
), en le modifiant, puis en l'enregistrant:
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
Pour accomplir le même exploit avec un seul appel de fonction, vous pouvez utiliser la méthode de update
:
$user->update([
'password' => bcrypt('my_new_password'),
]);
Les méthodes de create
et de update
simplifient le travail avec de grands ensembles de données plutôt que de devoir définir chaque paire clé / valeur individuellement, comme le montrent les exemples suivants:
Notez l'utilisation de
only
etexcept
lors de la collecte des données de demande. Il est important de spécifier les clés exactes que vous souhaitez autoriser / interdire pour la mise à jour, sinon il est possible pour un attaquant d'envoyer des champs supplémentaires avec leur requête et de provoquer des mises à jour involontaires.
// 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);
Effacer
Vous pouvez supprimer des données après les avoir écrites dans la base de données. Vous pouvez supprimer une instance de modèle si vous en avez extrait une ou spécifier des conditions pour les enregistrements à supprimer.
Pour supprimer une instance de modèle, récupérez-la et appelez la méthode delete()
:
$user = User::find(1);
$user->delete();
Vous pouvez également spécifier une clé primaire (ou un tableau de clés primaires) des enregistrements que vous souhaitez supprimer via la méthode destroy()
:
User::destroy(1);
User::destroy([1, 2, 3]);
Vous pouvez également combiner l'interrogation avec la suppression:
User::where('age', '<', 21)->delete();
Cela supprimera tous les utilisateurs correspondant à la condition.
Remarque: Lors de l' exécution d' une masse delete via Eloquent, la
deleting
etdeleted
les événements du modèle ne seront pas licenciés pour les modèles supprimés. En effet, les modèles ne sont jamais récupérés lors de l'exécution de l'instruction delete.
Suppression Douce
Parfois, vous ne souhaitez pas supprimer définitivement un enregistrement, mais le conserve pour des besoins d'audit ou de création de rapports. Pour cela, Eloquent fournit une fonctionnalité de suppression en douceur .
Pour ajouter des fonctionnalités de suppression logicielle à votre modèle, vous devez importer la caractéristique SoftDeletes
et l'ajouter à votre classe de modèle Eloquent:
namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
Lors de la suppression d'un modèle, il définira un horodatage sur la colonne d'horodatage deleted_at
de la table pour votre modèle. Veillez donc à créer d' deleted_at
colonne deleted_at
dans votre table. Ou dans la migration, vous devez appeler la méthode softDeletes()
sur votre plan pour ajouter l'horodatage deleted_at
. Exemple:
Schema::table('users', function ($table) {
$table->softDeletes();
});
Toute requête omettra les enregistrements supprimés. Vous pouvez les afficher de force si vous le souhaitez en utilisant la withTrashed()
:
User::withTrashed()->get();
Si vous souhaitez autoriser les utilisateurs à restaurer un enregistrement après une suppression en douceur (dans une zone de type corbeille), vous pouvez utiliser la méthode restore()
:
$user = User::find(1);
$user->delete();
$user->restore();
Pour supprimer un enregistrement avec force, utilisez la méthode forceDelete()
qui supprime véritablement l'enregistrement de la base de données:
$user = User::find(1);
$user->forceDelete();
Modifier la clé primaire et les horodatages
Par défaut, les modèles Eloquent s'attendent à ce que la clé primaire soit nommée 'id'
. Si ce n'est pas votre cas, vous pouvez modifier le nom de votre clé primaire en spécifiant la propriété $primaryKey
.
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
Maintenant, toutes les méthodes Eloquent qui utilisent votre clé primaire (par exemple, find
ou findOrFail
) utiliseront ce nouveau nom.
De plus, Eloquent s'attend à ce que la clé primaire soit un entier à auto-incrémentation. Si votre clé primaire n'est pas un entier auto-incrémenté (par exemple un GUID), vous devez indiquer à Eloquent en mettant à jour la propriété $incrementing
sur false
:
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
Par défaut, Eloquent s'attend à updated_at
colonnes created_at
et updated_at
existent sur vos tables. Si vous ne souhaitez pas que ces colonnes soient gérées automatiquement par Eloquent, définissez la propriété $timestamps
de votre modèle sur false:
class Citizen extends Model
{
public $timestamps = false;
// ...
}
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:
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
Lancer 404 si l'entité n'est pas trouvée
Si vous voulez lancer automatiquement une exception lorsque vous recherchez un enregistrement qui n’a pas été trouvé sur un modal, vous pouvez utiliser soit
Vehicle::findOrFail(1);
ou
Vehicle::where('make', 'ford')->firstOrFail();
Si un enregistrement avec la clé primaire de 1
n'est pas trouvé, une ModelNotFoundException
est levée. Ce qui est essentiellement la même chose que l'écriture ( voir la source ):
$vehicle = Vehicle::find($id);
if (!$vehicle) {
abort(404);
}
Modèles de clonage
Vous devrez peut-être cloner une ligne, peut-être changer quelques attributs, mais vous avez besoin d'un moyen efficace de garder les choses SÈCHES. Laravel fournit une sorte de méthode «cachée» pour vous permettre de faire cette fonctionnalité. Bien qu'il ne soit pas documenté, vous devez chercher dans l'API pour le trouver.
En utilisant $model->replicate()
vous pouvez facilement cloner un enregistrement
$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();
Le ci-dessus trouverait un robot qui a un identifiant de 1, puis le clone.