Maison  >  Article  >  développement back-end  >  Explication détaillée du framework Laravel des parties de base d'EloquentORM

Explication détaillée du framework Laravel des parties de base d'EloquentORM

黄舟
黄舟original
2017-03-21 09:22:121672parcourir

Eloquent ['eləkwənt], la méthode du constructeur de requête de base de données est également utilisée pour la classe modèle, mais la partie DB::table (« nom de la table ») est omise.

Utilisez la variable membre protégée $table dans le modèle pour spécifier le nom de la table liée.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;class Flight extends Model{    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = &#39;my_flights&#39;;
}

Eloquent Supposons que chaque table ait une clé primaire nommée id. Ce nom de champ peut être remplacé via la variable membre $primaryKey De plus, Eloquent suppose que le champ de clé primaire est. un entier incrémentiel, si vous souhaitez utiliser une clé primaire non incrémentée ou une clé primaire non numérique, vous devez spécifier l'attribut public $incrementing dans le modèle comme étant false.
Par défaut, Eloquent s'attend à ce que deux champs created_at et updated_at existent dans la table, et le type de champ est timestamp Si vous ne souhaitez pas que ces deux champs, définissez $timestamps sur false

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;class Flight extends Model{    /**
     * Indicates if the model should be timestamped.
     *
     * @var bool
     */
    public $timestamps = false;    /**
     * The storage format of the model&#39;s date columns.
     *
     * @var string
     */
    protected $dateFormat = &#39;U&#39;;
}
Utilisez protected $connection = 'connection-name' pour spécifier la connexion à la base de données utilisée par le modèle.

Requête

Opérations de requête de base# La

méthode all est utilisée pour renvoyer tous les résultats dans la table modèle

$flights = Flight::all();foreach ($flights as $flight) {    echo $flight->name;
}
Vous pouvez également utiliser la

méthode pour interroger les résultats Ajouter des contraintes get

$flights = App\Flight::where(&#39;active&#39;, 1)
     ->orderBy(&#39;name&#39;, &#39;desc&#39;)
     ->take(10)
     ->get();
Vous pouvez voir que la méthode constructeur de requête peut également être utilisée pour les classes de modèles

Dans ORM éloquent, les méthodes

et get interrogez plusieurs ensembles de résultats, leur valeur de retour est un all objet, qui fournit une variété de méthodes pour opérer sur l'ensemble de résultats IlluminateDatabaseEloquentCollection

public function find($key, $default = null);
public function contains($key, $value = null);
public function modelKeys();
public function diff($items)...
Il existe de nombreuses méthodes pour cet objet, seule une petite partie est répertoriée ici. Pour plus de méthodes, reportez-vous à la documentation de l'API Documentation sur la collection et l'utilisation. Pour le traitement segmenté d'un grand nombre de résultats, la méthode chunk est également utilisée

Flight::chunk(200, function ($flights) {
    foreach ($flights as $flight) {        //
    }
});
pour interroger un seul résultat

et les méthodes

et find sont utilisées pour interroger un seul résultat et une seule instance de modèle sont renvoyés. first

// 通过主键查询模型...$flight = App\Flight::find(1);

// 使用约束...$flight = App\Flight::where(&#39;active&#39;, 1)->first();
L'utilisation de la méthode

peut également renvoyer plusieurs résultats, sous la forme d'un objet find, et les paramètres sont plusieurs clés primaires Collection

$flights = App\Flight::find([1, 2, 3]);
Si aucun résultat ne peut être trouvé, vous pouvez utiliser la méthode

ou findOrFail Ces deux méthodes lanceront une exception firstOrFail lorsqu'aucun résultat n'est trouvé IlluminateDatabaseEloquentModelNotFound<a href="http://www.php.cn/wiki/265.html" target="_blank">Exception</a>

.
$model = App\Flight::findOrFail(1);$model = App\Flight::where(&#39;legs&#39;, &#39;>&#39;, 100)->firstOrFail();
Si cette exception n'est pas interceptée, laravel retournera automatiquement. Donnez à l'utilisateur un résultat de réponse 404, donc si vous souhaitez renvoyer 404 lorsqu'il n'est pas trouvé, vous pouvez directement utiliser cette méthode pour renvoyer

Route::get(&#39;/api/flights/{id}&#39;, function ($id) {
    return App\Flight::findOrFail($id);
});
Agrégation de requêtes

FonctionRésultat

Identique à la méthode de requête du générateur de requêtes, vous pouvez utiliser des fonctions d'agrégation pour renvoyer des résultats, courants tels que max, min, moy, sum, count, etc.

$count = App\Flight::where(&#39;active&#39;, 1)->count();$max = App\Flight::where(&#39;active&#39;, 1)->max(&#39;price&#39;);
Requête de page

La requête de page peut utiliser directement la fonction de pagination

LengthAwarePaginator paginate( 
    int $perPage = null, 
    array $columns = array(&#39;*&#39;), 
    string $pageName = &#39;page&#39;, 
    int|null $page = null)
Description du paramètre

Description du type de paramètre
perPage int Afficher la quantité par page
colonnes tableau Nom de la colonne de requête
pageName chaîne Nom du paramètre du numéro de page
page int Numéro de la page actuelle

La valeur de retour est l'objet

. LengthAwarePaginator

$limit = 20;$page = 1;return Enterprise::paginate($limit, [&#39;*&#39;], &#39;page&#39;, $page);
Insérer

Opérations d'insertion de base #

L'insertion de nouvelles données nécessite uniquement la création d'une nouvelle instance de modèle, puis la définition des attributs du modèle et enfin l'appel de la méthode de sauvegarde.

$flight = new Flight;$flight->name = $request->name;$flight->save();
Lors de l'appel de la méthode de sauvegarde, les horodatages seront automatiquement définis pour les champs create_at et update_at. Il n'est pas nécessaire de spécifier manuellement

Numéro d'insertion d'affectation par lots

. Utilisez

La méthode peut effectuer une opération d'insertion consistant à attribuer des valeurs aux attributs du modèle par lots. Cette méthode renverra le modèle nouvellement inséré Avant d'exécuter la méthode create, vous devez spécifier le create et attributs dans le modèle pour empêcher l'attribution d'attributs illégale (par exemple, pour empêcher l'attribut fillable transmis par l'utilisateur d'être saisi par erreur dans la table de données). guardedis_adminLe but de la spécification de l'attribut

est que le champ spécifié par cet attribut peut être inséré via la méthode

, et les autres champs seront filtrés, comme une liste blanche, tandis que $fillable est le contraire, semblable à une liste de liste noire. create$guarded

Lors de l'opération de création, seuls les champs en dehors de la liste blanche ou de la liste noire peuvent être mis à jour
protected $fillable = [&#39;name&#39;];// ORprotected $guarded = [&#39;price&#39;];

En plus de la méthode de création, deux autres méthodes peuvent être utilisées : firstOrNew et firstOrCreate. La méthode
$flight = App\Flight::create([&#39;name&#39; => &#39;Flight 10&#39;]);

est utilisée pour interroger l'enregistrement

en utilisant la paire de valeurs de colonne donnée firstOrCreate et en insérer un nouveau s'il est introuvable. est similaire à , sauf que s'il n'existe pas, il renverra un nouvel objet modèle. Cependant, le modèle n'est pas persistant et doit être appelé manuellement pour enregistrer l'objet modèle à conserver dans la base de données. . fristOrNewfirstOrCreate

Mise à jour
// 使用属性检索flight,如果不存在则创建...$flight = App\Flight::firstOrCreate([&#39;name&#39; => &#39;Flight 10&#39;]);

// 使用属性检索flight,如果不存在则创建一个模型实例...$flight = App\Flight::firstOrNew([&#39;name&#39; => &#39;Flight 10&#39;]);

Opération de mise à jour de base #

La méthode de sauvegarde peut non seulement être utilisée pour insérer de nouvelles données, mais également pour mettre à jour les données, il suffit d'utiliser d'abord le modèle. La méthode interroge les données à mettre à jour, définit les attributs du modèle sur de nouvelles valeurs, puis enregistre pour mettre à jour. Le champ update_at sera automatiquement mis à jour.

$flight = App\Flight::find(1);$flight->name = &#39;New Flight Name&#39;;$flight->save();

也可使用update方法对多个结果进行更新

App\Flight::where(&#39;active&#39;, 1)
    ->where(&#39;destination&#39;, &#39;San Diego&#39;)
    ->update([&#39;delayed&#39; => 1]);

删除

基本删除操作#
使用delete方法删除模型

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

上述方法需要先查询出模型对象,然后再删除,也可以直接使用主键删除模型而不查询,使用destroy方法

App\Flight::destroy(1);App\Flight::destroy([1, 2, 3]);App\Flight::destroy(1, 2, 3);

使用约束条件删除,返回删除的行数

$deletedRows = App\Flight::where(&#39;active&#39;, 0)->delete();

软删除

软删除是在表中增加deleted_at字段,当删除记录的时候不会真实删除记录,而是设置该字段的时间戳,由Eloquent模型屏蔽已经设置该字段的数据。

要启用软删除,可以在模型中引用Illuminate\Database\Eloquent\SoftDeletes这个Trait,并且在dates属性中增加deleted_at字段。

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model{
    use SoftDeletes;    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [&#39;deleted_at&#39;];
}

要判断一个模型是否被软删除了的话,可以使用trashed方法

if ($flight->trashed()) {    //}

查询软删除的模型#

包含软删除的模型#

如果模型被软删除了,普通查询是不会查询到该结果的,可以使用withTrashed方法强制返回软删除的结果

$flights = App\Flight::withTrashed()
      ->where(&#39;account_id&#39;, 1)
      ->get();// 关联操作中也可以使用
$flight->history()->withTrashed()->get();

只查询软删除的模型#

$flights = App\Flight::onlyTrashed()
      ->where(&#39;airline_id&#39;, 1)
      ->get();

还原软删除的模型#

查询到软删除的模型实例之后,调用restore方法还原

$flight->restore();

也可以在查询中使用

App\Flight::withTrashed()
    ->where(&#39;airline_id&#39;, 1)
    ->restore();// 关联操作中也可以使用
$flight->history()->restore();

强制删除(持久化删除)#

// Force deleting a single model instance...$flight->forceDelete();
// Force deleting all related models...$flight->history()->forceDelete();

上述操作后,数据会被真实删除。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn