Vous êtes sur la page 1sur 27
 

Les Les billets billets Laracon Laracon EU EU sont sont maintenant maintenant disponibles! disponibles!

 
S E A R C H 5.8 ☰

S E A R C H

5.8
5.8
☰

El oquent: Commencer

# introduction

# Définirdes modèles

# Conventions modèles éloquentes

# Valeursd'attribut pardéfaut

# Récurerdes modèles

# Des collections

# sultats tronqués

# Récuration de modèlesuniques / agrégats

# Récuration des agrégats

# Insertion et mise à jourde modèles

# Inserts

# Mises à jour

# Affectation de masse

# Autres méthodesde création

# Suppression de modèles

# Suppression douce

# Interrogation de modèlessupprimés progressivement

# Portéesde la requête

# Portées globales

# Portées locales

# Comparaison de modèles

# Événements

# Observateurs

#i ntr oduction

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 rechercherdesdonnées

dans vos tables, ainsi que d'insérerde nouveaux enregistrementsdans la table.

Avant de commencer, assurez-vousde configurerune connexion de base de donnéesdans . Pour plus d'informationssur la configuration de votre base de données, consultez la documentation

e d e d onnée s , con su lte z la d oc u mentation

#Définir des modèles

Pour commencer, créonsun modèle Eloquent. Les modèlesrésident généralement dans le

Le s mo d èle sr é s i d ent géné r alement d an

app répertoire, mais vous êtes libre de les placer à tout endroit pouvant être chargé automatiquement

en fonction de votre fichier. Tous les modèlesEloquent étendent la

r . To us le s mo d èle sE loq u ent éten d ent

classe. composer.json Illuminate\Database\Eloquent\Model

Le moyen le plussimple de créerune instance de modèle consiste à utiliser la commande Artisan

make:model

php artisan make:model Flight

Si voussouhaitez générerune migration de base de données lorsque vous générez le modèle, vous

pouvezutiliser l' option

--migration ou -m :
--migration ou
-m :

php artisan make:model Flight --migration

php artisan make:model Flight -m

C onventions modèles éloquentes

Examinons maintenant un exemple de

informations à partirde notre

u n exemple d e info r mation s à pa r ti rd e not

Flight modèle que nous utiliserons pour extraire et stocker des

flights table de base de données:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

}

//

No ms de table
No ms de table

Notez que nous n'avons pas indiqué à Eloquent quelle table utiliser pour notre

convention, le nom au pluriel "casduserpent" 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

stocke les enregistrementsdans la

définissant une

le s en r egi s t r ement sd an s la d éfini ss

Flight modèle. Par

la d éfini ss ant u ne F l i g h t mo d èle.

Flight modèle

u ne F l i g h t mo d èle. Pa r Flight mo d

flights table. Vous pouvez spécifier une table personnalisée en

us po u ve z s pécifie r u ne table pe rs onnali s ée

table propriété sur votre modèle:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

 

/**

*

The table associated with the model.

*

*

@var string

*/

protected $table = 'my_flights';

}

Clés primaires

Eloquent supposera également que chaque table a une colonne de clé primaire nommée

pouvezdéfinirune

d e clé p r imai r e nommée po u ve zd éfini ru ne

$primaryKey propriété protégée pour remplacer cette convention.

r iété p r otégée po ur r emplace r cette convention. i d . Vo

id . Vous

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

primaire non incrémentée ou non nurique, vousdevezdéfinir la

votre modèle sur

false . Si votre clé primaire n'est pas un entier, vous devez définir la

n'e s t pa s u n entie r , vo us d eve z d

int automatiquement en une clé . Si vous souhaitez utiliser une clé

u ne clé . Si vo us s o u haite z u tili s e

$incrementing propriété publique de

e m e n t i n g p r op r iété p u bliq

$keyType propriété protected sur votre modèle

string .
string .

Horodatage

Pardéfaut, Eloquent s'attend à ce

d atage Pa rd éfa u t, E loq u ent s 'atten d à ce

created_at que des

E loq u ent s 'atten d à ce created_at q u e d e s

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 :
false :

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

 

/**

*

Indicates if the model should be timestamped.

*

*

@var bool

*/

public $timestamps = false;

}

Si vousdevez personnaliser le format de vos horodatages, définissez la

modèle. Cette propriété détermine la manière dont les attributsde date sont stockésdans la base de données, ainsi que leur format lorsque le modèle est sérialisé en tableau ou en JSON:

d èle e s t s é r iali s é en tablea u o u

$dateFormat propriété sur votre

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

 

/**

*

The storage format of the model's date columns.

*

*

@var string

*/

protected $dateFormat = 'U';

}

Si vous devez personnaliser les noms des colonnes utilisées pour stocker les horodatages, vous pouvez

définir les constantes

d atage s , vo us po u ve z d éfini r le s con

CREATED_AT et

us po u ve z d éfini r le s con s tante s CREATED_AT et

UPDATED_AT dans votre modèle:

const CREATED_AT = 'creation_date';

const UPDATED_AT = 'last_update';

}

; const UPDATED_AT = 'last_update' ; } C onnexion à la ba s e d e

C onnexion à la bas e de données

Par défaut, tous les modèles Eloquent utiliseront la connexion à la base de données par défaut configurée pour votre application. Si vous souhaitez spécifier une connexion différente pour le modèle,

utilisez la

d iffé r ente po ur le mo d èle, u tili s e z la

$connection propriété:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

 

/**

*

The connection name for the model.

*

*

@var string

*/

protected $connection = 'connection-name';

}

Valeurs d'attribut par défaut

Si vous souhaitez définir les valeurs par défaut de certains attributs de votre modèle, vous pouvez

définirune

u t s d e vot r e mo d èle, vo us po u ve

$attributes propriété sur votre modèle:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model

{

/**

*

The model's default values for attributes.

*

*

@var array

*/

protected $attributes = [

'delayed' => false,

}

];

#Récurer des modèles

Une fois que vous avez créé un modèle et sa table de base de données associée , vous êtes prêt à commencer à extraire desdonnéesde votre base de données. Considérez chaque modèle Eloquent comme un puissant générateurde requêtes vous permettant d'interroger facilement la table de base de données associée au modèle. Par exemple:

<?php

$flights = App\Flight::all();

foreach ($flights as $flight) {

echo $flight->name;

}

A jou t de contraintes supplémentaires

; } A jo u t d e cont r ainte s su pplémentai r e
; } A jo u t d e cont r ainte s su pplémentai r e

La

chaque modèle Eloquent sert de générateurde requête , vous pouvez également ajouterdes contraintes

aux requêtes, puisutiliser la

all méthode Eloquent renverra tous les résultats dans le tableau du modèle. Étant donné que

s d an s le tablea u du mo d èle. É tant d onné q
s d an s le tablea u du mo d èle. É tant d onné q

get méthode pour extraire les résultats:

$flights = App\Flight::where('active', 1)

->orderBy('name', 'desc')

->take(10)

->get();

M o d èle s r af r aîchi ss ant s od èles rafraîchissants

Vous pouvez actualiser les modèles à l'aide des méthodes

récurera le modèle de la base de données. L'instance de modèle existante ne sera pas affectée:

fresh et refresh . La fresh
fresh et
refresh . La
fresh

méthode

$flight = App\Flight::where('number', 'FR 900')->first();

$freshFlight = $flight->fresh();

La

données. En outre, toutessesrelations chargéesseront également actualisées:

s cha r gée ss e r ont également act u ali s ée s :

refresh méthode réhydratera le modèle existant en utilisant de nouvelles données de la base de

$flight = App\Flight::where('number', 'FR 900')->first();

$flight->number = 'FR 456';

$flight->refresh();

$flight->number; // "FR 900"

Des collections

Pour les méthodesEloquent telles que

sera retournée. La classe fournit une variété de méthodesutiles pour travailler avec vosrésultats

su tile s po ur t r availle r avec vo sr é su ltat s

all et

s po ur t r availle r avec vo sr é su ltat s all et

get qui récurent plusieurs résultats, une instance de

r ent pl us ie urs r é su ltat s , u ne in s

Eloquent: Illuminate\Database\Eloquent\Collection Collection

$flights = $flights->reject(function ($flight) {

return $flight->cancelled;

});

Vous pouvez également parcourir la collection comme un tableau:

foreach ($flights as $flight) {

echo $flight->name;

}

sultats tronqués

Si vousdevez traiterdes milliersd'enregistrementsEloquent, utilisez la

'en r egi s t r ement sE loq u ent, u tili s e z

chunk commande. La

c h u n k métho d e r éc u pé r e r chunk méthode récurera un "bloc" de modèles Eloquent, les alimentant à une donnée

Closure à
Closure à

traiter. L'utilisation de cette

travaillerez avec de grands ensemblesde résultats:

e z avec d e g r an ds en s emble sd e r é

chunk méthode vous permettra d'économiser de la mémoire lorsque vous

Flight::chunk(200, function ($flights) {

foreach ($flights as $flight) {

});

}

//

Le premier argument transmis à la méthode est le nombre d'enregistrements que voussouhaitez 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.

r egi s t r ement s t r an s mi s à la fe

U tilis ation de curseurs

mi s à la fe r met ur e. U tili s ation d e c

La

d'un curseur, qui n'exécutera qu'une seule requête. Lorsdu traitement de grandes quantitésde

Lo rsdu t r aitement d e g r an d e s q u antité

cursor méthode vous permet de parcourir les enregistrements de votre base de données à l'aide

données, la

c u r s o r métho d e pe u t êt r e

cursor méthode peut être utilisée pour réduire considérablement votre utilisation de la

mémoire:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {

}

//

#Récuration de modèles uniques / agrégats

En plus de récurer tous les enregistrements d'une table donnée, vous pouvez également extraire des

enregistrementsuniques à l'aide de

méthodesrenvoient une seule instance de modèle:

find ou
find ou

first . Au lieu de renvoyer une collection de modèles, ces

// Retrieve a model by its primary key

$flight = App\Flight::find(1);

// Retrieve the first model matching the query constraints

$flight = App\Flight::where('active', 1)->first();

Vous pouvez également appeler la

collection des enregistrements correspondants:

d e s en r egi s t r ement s co rr e s pon

find méthode avec un tableau de clés primaires, qui renverront une

$flights = App\Flight::find([1, 2, 3]);

Ex ceptions Introuvables

:: find ([ 1 , 2 , 3 ]); E x ception s I nt r

Parfois, vous souhaiterez peut-être lancer une exception si aucun modèle n’est trouvé. Ceci est

particulièrement utile dans lesroutes ou les contrôleurs. Les méthodes

récurer le premierrésultat de la requête; Cependant, si aucun résultat n'est trouvé, un sera

findOrFail et
findOrFail et

firstOrFail vont

t t r o u vé, u n s e r a findOrFail et firstOrFail vont

lancé: Illuminate\Database\Eloquent\ModelNotFoundException

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

Si l'exception n'est pas interceptée, une

l'utilisateur. Il n'est pas nécessaire d'écrire des rifications explicites pour renvoyer les lorsde l'utilisation de ces méthodes:

s lo rsd e l' u tili s ation d e ce s métho d e

404 réponse HTTP est automatiquement renvoyée à

r épon s e H TTP e s t a u tomatiq u ement r envoyée

404 réponses

Route::get('/api/flights/{id}', function ($id) {

return App\Flight::findOrFail($id);

});

Récuration des agrégats

Vous pouvez également utiliser les

générateur de requêtes . Ces méthodes renvoient la valeur scalaire appropriée au lieu d'une instance de modèle complète:

count , sum ,
count ,
sum ,

max et d' autres méthodes globales fournies par le

$count = App\Flight::where('active', 1)->count();

$max = App\Flight::where('active', 1)->max('price');

#Insertion et mise à jour de modèles

Inserts

To create a newrecord in the database, create a new model instance, set attributes on the model, then

call the

save
save

method:

<?php

namespace App\Http\Controllers;

use App\Flight;

use Illuminate\Http\Request;

use App\Http\Controllers\Controller;

class FlightController extends Controller

{

 

/**

* Create a new flight instance.

*

* @param Request $request

* @return Response

*/

public function store(Request $request)

{

 

// Validate the request

$flight = new Flight;

$flight->name = $request->name;

$flight->save();

 

}

}

In this example, we assign the

of the

database. The

name
name

parameter from the incoming HTTP request to the

save
save
name
name

attribute

App\Flight created_at
App\Flight
created_at

model instance. When we call the

and

updated_at

method, a recordwill be inserted into the

save
save

timestampswill automatically be set when the

method is called, so there is no need to set them manually.

U pd ates

The

model, youshouldretrieve it, set any attributes youwish to update, and then call the

save
save

method may also be used to update models that already exist in the database. To update a

save
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->name = 'New Flight Name';

$flight->save();

M as s Updates

Name' ; $flight ->save (); M a s s Up d ate s Up d ate

Updates can also be performed against any number of models that match a given query. In this

example, all flights that are

active
active

and have a

destination of San Diego
destination
of
San Diego

will be marked asdelayed:

App\Flight::where('active', 1)

->where('destination', 'San Diego')

->update(['delayed' => 1]);

The update method expects an array of column and value pairs representing the columns that
The
update
method expects an array of column and value pairs representing the columns that should
be updated.
Lorsde 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 jamaisréellement récupérés lorsde la mise à jour en masse.

Affectation de masse

Vous pouvez également utiliser cette

seule ligne. L'instance de modèle insérée vous sera renvoyée par la méthode. Cependant, avant de le

faire, vousdevrezspécifierun attribut

modèles Eloquent protègent contre les affectations en masse par défaut.

cont r e le s affectation s en ma ss e pa r d éfa u

create méthode pour enregistrer un nouveau modèle sur une

ur en r egi s t r e r u n no u vea u mo

guarded attribut sur le modèle, car tous les

e d att r ib u t sur le mo d èle, ca r to us

fillable ou un

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 envoyerun

HTTP, qui est ensuite transmise à la

de se faire passer pourun administrateur.

is_admin

paramètre via une requête

t r ate ur . is_admin pa r amèt r e via u ne r eq

create méthode de votre modèle , permettant ainsi à l'utilisateur

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

exemple, assignons l'