Maison  >  Article  >  développement back-end  >  Introduction au modèle Eloquent de Laravel

Introduction au modèle Eloquent de Laravel

不言
不言original
2018-07-04 15:31:252031parcourir

Cet article présente principalement l'introduction du modèle Eloquent de Laravel. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Modèle Eloquent

Héritage par défaut. la classe use IlluminateDatabaseEloquentModel.

Nom de la table de données et convention de nom de modèle :

Les noms des tables de base de données sont généralement nommés en utilisant la « nomenclature des serpents ». La nomenclature des serpents exige que les mots soient en minuscules, que les mots soient reliés par des traits de soulignement et que les noms soient au pluriel.

Le nom du modèle correspondant est nommé selon la "méthode Pascal", c'est-à-dire c'est-à-dire que la première lettre de chaque mot est en majuscule.

Si l'accord ci-dessus n'est pas respecté, la fiche technique correspondante doit être précisé :

class Flight extends Model
{    /**
     * 与模型关联的数据表
     *
     * @var string     */
    protected $table = 'myflights';
}

Clé primaire :

La table de données par défaut du modèle utilise le champ id comme clé primaire, et c'est un type entier croissant. Ceux-ci peuvent être personnalisés :

class Flight extends Model
{    /**
     * 与模型关联的数据表     */
    protected $table = 'my_flights';    protected $primaryKey='mid';  //自定义主键字段
    
    protected $keyType = 'string';  //自定义主键类型为字串
    
    public $incrementing = false;    //主键非自增型}

Heure limite :

Le modèle a deux champs, Created_at et Updated_at par défaut. Vous pouvez définir $timestamps sans les deux champs. :

class Flight extends Model
{    /**
     * 该模型是否被自动维护时间戳     */
    public $timestamps = false;
}

L'attribut $dateFormat peut personnaliser le format de l'heure limite. Le format stocké dans la table de données :

class Flight extends Model
{    /**
     * 模型的日期字段的存储格式     */
    protected $dateFormat = 'U';
}

Nom du champ d'heure limite personnalisé :

<?phpclass Flight extends Model
{    const CREATED_AT = &#39;creation_date&#39;;    const UPDATED_AT = &#39;last_update&#39;;
}

Connexion à la base de données personnalisée :

class Flight extends Model
{    /**
     * 此模型的连接名称。     */
    protected $connection = &#39;connection-name&#39;;
}

Requête de modèle :

use App\Flight;$flights = App\Flight::all();   //查询所有数据
foreach ($flights as $flight) {    echo $flight->name;
}$flights = App\Flight::where(&#39;active&#39;, 1)               
->orderBy(&#39;name&#39;, &#39;desc&#39;)               
->take(10)               
->get();             //有条件地查询数据

toutes les méthodes et get renvoient IlluminateDatabaseEloquentCollection exemple.

Si vous interrogez de gros lots de données, vous pouvez utiliser des morceaux pour économiser de la mémoire :

Flight::chunk(200, function ($flights) {    foreach ($flights as $flight) {        //    }
});

ou utiliser la méthode du curseur pour réduire considérablement l'utilisation de la mémoire :

foreach (Flight::where(&#39;foo&#39;, &#39;bar&#39;)->cursor() as $flight) {    //}

Requête d'une seule donnée :

// 通过主键取回一个模型...$flight = App\Flight::find(1);
// 取回符合查询限制的第一个模型 ...
$flight = App\Flight::where(&#39;active&#39;, 1)->first();//如果找不到模型则抛出异常
//Illuminate\Database\Eloquent\ModelNotFoundException
//自动返回 HTTP 404 响应给用户
$model = App\Flight::where(&#39;legs&#39;, &#39;>&#39;, 100)->firstOrFail();

Requête d'agrégation :

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

Mise à jour des données :

méthode de sauvegarde : obligatoire Récupérez-le d'abord une fois, puis définissez les attributs à mettre à jour, puis exécutez la méthode de sauvegarde. En même temps, update_at sera automatiquement mis à jour.

méthode de mise à jour : définissez la condition Where et transmettez le champ de mise à jour dans la méthode de mise à jour sous forme de paire clé-valeur. La mise à jour ne déclenche pas les événements de modèle enregistrés et mis à jour.

$flight = App\Flight::find(1);
$flight->name = &#39;New Flight Name&#39;;$flight->save(); //查询一次后再更新
App\Flight::where(&#39;active&#39;, 1)          
->where(&#39;destination&#39;, &#39;San Diego&#39;)          
->update([&#39;delayed&#39; => 1]); //设置条件后再批量更新

Insérer des données :

Pour utiliser le modèle pour créer des données, vous devez d'abord définir l'attribut $fillable ou $guarded. Vous ne pouvez choisir qu'un seul des deux attributs.

class Flight extends Model
{    /**
     * 可以被批量赋值的属性。
     * @var array     */
    protected $fillable = [&#39;name&#39;];
}class Flight extends Model
{    /**
     * 不可被批量赋值的属性。可定义为空数组,表示所有属性都可以赋值。
     * @var array     */
    protected $guarded = [&#39;price&#39;];
}

Méthode d'insertion des données :

$flight = App\Flight::create([&#39;name&#39; => &#39;Flight 10&#39;]); //添加新记录并返回已保存的模型实例
$flight->fill([&#39;name&#39; => &#39;Flight 22&#39;]); //已有实例模型可使用fill方法
// 通过 name 属性检索航班,当结果不存在时创建它...
$flight = App\Flight::firstOrCreate([&#39;name&#39; => &#39;Flight 10&#39;]);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它$flight = App\Flight::firstOrCreate(
    [&#39;name&#39; => &#39;Flight 10&#39;], [&#39;delayed&#39; => 1]
);// 通过 name 属性检索航班,当结果不存在时实例化...
$flight = App\Flight::firstOrNew([&#39;name&#39; => &#39;Flight 10&#39;]);// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化$flight = App\Flight::firstOrNew(
    [&#39;name&#39; => &#39;Flight 10&#39;], [&#39;delayed&#39; => 1]
);// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元
// 如果不存在匹配的模型就创建一个
$flight = App\Flight::updateOrCreate(
    [&#39;departure&#39; => &#39;Oakland&#39;, &#39;destination&#39; => &#39;San Diego&#39;],
    [&#39;price&#39; => 99]
);

firstOrCreate : Si les données sont introuvables, créez un enregistrement basé sur les premier et deuxième enregistrements de paramètres et renvoyez l'enregistrement enregistré Modèle ;

firstOrNew : Si les données ne peuvent pas être trouvées, un nouveau modèle sera créé sur la base des premier et deuxième enregistrements de paramètres, mais les données ne seront pas enregistrées. ;

updateOrCreate : Mettez à jour les données du deuxième paramètre en fonction du premier paramètre comme condition. Si les données n'existent pas, fusionnez les deux paramètres pour créer un enregistrement et renvoyer le modèle enregistré.

Supprimer des modèles :

$flight = App\Flight::find(1);$flight->delete();  //通过查询所得的模型实例进行delete方法删除

//通过主键删除一至多条数据: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();

Lors d'une suppression par lots, les événements de suppression et de suppression de modèle ne seront pas déclenchés.

Suppression logicielle :

La table de données doit définir le champ delete_at. Référencez le trait SoftDeletes dans le modèle et définissez le champ delete_at sur l'attribut $dates.

<?php

namespace App;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model
{    use SoftDeletes;    /**
     * 需要被转换成日期的属性。
     * @var array     */
    protected $dates = [&#39;deleted_at&#39;]; 
}

Le modèle de suppression logicielle est défini et delete_at est défini sur la date et l'heure actuelles dans la méthode de suppression. L’interrogation de modèles supprimés de manière réversible exclura automatiquement les modèles supprimés de manière réversible.

if ($flight->trashed()) {    //检查该模型实例是否被软删除}$flights = App\Flight::withTrashed()  //能使用查询包含软删除的数据
                ->where(&#39;account_id&#39;, 1)                ->get();$flights = App\Flight::onlyTrashed()  //只查询软删除的数据
                ->where(&#39;airline_id&#39;, 1)                ->get();$flight->restore();  //恢复被软删除的模型App\Flight::withTrashed()   //批量恢复模型,不会触发任何模型事件
        ->where(&#39;airline_id&#39;, 1)        ->restore();

Le modèle de suppression logicielle utilise la suppression forcée :

$flight->forceDelete( );

Portée de la requête :

Ajouter des contraintes de requête au modèle . Il en existe deux types : global et local :

global : les contraintes conditionnelles sont automatiquement ajoutées à chaque requête ;

local : les contraintes locales sont appelées selon les besoins.

Portée globale :

Vous devez d'abord implémenter la classe d'interface scope.

<?php

namespace App\Scopes;use Illuminate\Database\Eloquent\Scope;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Builder;class AgeScope implements Scope
{    /**
     * 将范围应用于给定的 Eloquent 查询生成器
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void     */
    public function apply(Builder $builder, Model $model)
    {        return $builder->where(&#39;age&#39;, &#39;>&#39;, 200);
    }
}

Si la portée globale souhaite ajouter des champs à l'instruction select de la requête, vous devez utiliser La méthode addSelect au lieu de select,以免替换查询的现有select。

applique la portée globale :

Utilisez la méthode addGlobalScope dans la méthode de démarrage du modèle.

<?php

namespace App;use App\Scopes\AgeScope;use Illuminate\Database\Eloquent\Model;class User extends Model
{    /**
     * 模型的「启动」方法
     *
     * @return void     */
    protected static function boot()
    {
        parent::boot();        static::addGlobalScope(new AgeScope);
    }
}

Vous pouvez également utiliser des fermetures pour définir la portée globale sans définir de classe distincte :

class User extends Model
{    /**
     * 模型的「启动」方法
     *
     * @return void     */
    protected static function boot()
    {
        parent::boot();        
        static::addGlobalScope(&#39;age&#39;, function(Builder $builder) {            
        $builder->where(&#39;age&#39;, &#39;>&#39;, 200);
        });
    }
}

Supprimer la portée globale :

User::withoutGlobalScope(AgeScope::class)->get();  //删除指定的作用域

// 删除所有的全局作用域User::withoutGlobalScopes()->get();// 删除一些全局作用域User::withoutGlobalScopes([
    FirstScope::class, SecondScope::class])->get();

Portée locale Domaine :

定义通用的约束在需要时使用。定义方法:在模型内定义scope前缀的方法。

<?php

namespace App;use Illuminate\Database\Eloquent\Model;class User extends Model
{    /**
     * 限制查询只包括受欢迎的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopePopular($query)
    {        return $query->where(&#39;votes&#39;, &#39;>&#39;, 100);
    }    /**
     * 限制查询只包括活跃的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeActive($query)
    {        return $query->where(&#39;active&#39;, 1);
    }
}

使用方法:

$users = App\User::popular()->active()->orderBy(&#39;created_at&#39;)->get();

动态作用域:

class User extends Model
{    /**
     * 限制查询只包括指定类型的用户。
     *
     * @return \Illuminate\Database\Eloquent\Builder     */
    public function scopeOfType($query, $type)
    {        return $query->where(&#39;type&#39;, $type);
    }
}//调用作用域时传参$users = App\User::ofType(&#39;admin&#39;)->get();

模型事件:

retrieved --查询触发

creatingcreated--创建触发

updatingupdated--更新触发

savingsaved--创建、更新触发

deletingdeleted--删除触发

restoringrestored--恢复触发

事件指派相应的监控器:

<?php

namespace App;use App\Events\UserSaved;use App\Events\UserDeleted;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;class User extends Authenticatable
{    use Notifiable;    /**
     * 模型的事件映射。
     *
     * @var array     */
    protected $dispatchesEvents = [        &#39;saved&#39; => UserSaved::class,   //触发saved事件,调用UserSaved监控器
        &#39;deleted&#39; => UserDeleted::class, //触发deleted事件,调用UserDeleted监控器    ];
}

也可所有监听放在一个观察器类中:

<?php

namespace App\Observers;use App\User;class UserObserver
{    /**
     * 监听用户创建的事件。
     *
     * @param  User  $user
     * @return void     */
    public function created(User $user)
    {        //    }    /**
     * 监听用户删除事件。
     *
     * @param  User  $user
     * @return void     */
    public function deleting(User $user)
    {        //    }
}

注册观察器:

<?php

namespace App\Providers;use App\User;use App\Observers\UserObserver;
use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider
{    /**
     * 运行所有应用.
     *
     * @return void     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

 Laravel 开发支付宝支付与提现转账的方法

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