Heim >Backend-Entwicklung >PHP-Tutorial >Einführung in das Eloquent-Modell von Laravel

Einführung in das Eloquent-Modell von Laravel

不言
不言Original
2018-07-04 15:31:252097Durchsuche

Dieser Artikel stellt hauptsächlich das Eloquent-Modell von Laravel vor. Es hat einen gewissen Referenzwert. Jetzt können Freunde in Not darauf verweisen.

Default Inherit die

use

IlluminateDatabaseEloquentModel-Klasse.

Konvention für Datentabellennamen und Modellnamen:

Datenbanktabellennamen werden im Allgemeinen nach der „Schlangennomenklatur“ benannt. Die Schlangennomenklatur erfordert, dass Wörter in Kleinbuchstaben geschrieben werden, Wörter durch _Unterstriche verbunden werden und Namen im Plural stehen.

Der entsprechende Modellname wird nach der „Pascal-Methode“ benannt, d.h Das heißt, der erste Buchstabe jedes Wortes wird großgeschrieben.

Wenn die obige Vereinbarung nicht eingehalten wird, muss das entsprechende Datenblatt eingehalten werden angegeben werden:

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

Die Standarddatentabelle des Modells verwendet das ID-Feld als Primärschlüssel und es ist ein steigender Ganzzahltyp. Diese können angepasst werden:

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

Zeitlimit:

Das Modell verfügt standardmäßig über zwei Felder, erstellt_at und aktualisiert_at. Sie können $timestamps ohne die beiden Felder festlegen:

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

Das Attribut $dateFormat kann das in der Datentabelle gespeicherte Format anpassen:

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

Benutzerdefinierter Zeit-Cutoff-Feldname:

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

Benutzerdefinierte Datenbank Verbindung:

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

Modellabfrage:

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();             //有条件地查询数据
alle und get-Methoden geben

IlluminateDatabaseEloquentCollection

Instanzen zurück. Wenn Sie große Datenmengen abfragen, können Sie Chunks verwenden, um Speicher zu sparen:

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

oder die Cursor-Methode Cursor verwenden, um die Speichernutzung erheblich zu reduzieren:

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

Abfrage Einzelnes Datenelement:

// 通过主键取回一个模型...$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();
Aggregationsabfrage:

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

Datenaktualisierung:

Speichermethode: Es muss abgerufen werden Zuerst und dann auf „Aktualisieren“ festlegen. Führen Sie dann die Speichermethode für das Attribut aus, und „update_at“ wird gleichzeitig automatisch aktualisiert.

Update-Methode: Legen Sie die Where-Bedingung fest und übergeben Sie das Update-Feld als Schlüssel-Wert-Paar an die Update-Methode. Die Aktualisierung löst keine gespeicherten und aktualisierten Modellereignisse aus.

$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]); //设置条件后再批量更新

Daten einfügen:

Um das Modell zum Erstellen von Daten zu verwenden, müssen Sie zuerst das Attribut $fillable oder $guarded festlegen. Sie können nur eines der beiden Attribute auswählen.

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

Methode zum Einfügen von Daten:

$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: Wenn die Daten nicht gefunden werden können, erstellen Sie einen Datensatz basierend auf dem ersten und zweiten Parameterdatensatz und geben Sie das gespeicherte Modell zurück;

firstOrNew: Wenn die Daten nicht gefunden werden können, wird ein neues Modell basierend auf dem ersten und zweiten Parameterdatensatz erstellt, aber die Daten werden nicht gespeichert. Sie müssen es manuell speichern, um die Daten zu speichern updateOrCreate: Basierend auf dem ersten Parameter werden die Daten des zweiten Parameters als Bedingung aktualisiert. Wenn die Daten nicht vorhanden sind, werden die beiden Parameter zusammengeführt, um einen Datensatz zu erstellen und zum gespeicherten Modell zurückzukehren.

Modelle löschen:

$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();

Beim stapelweisen Löschen werden die Ereignisse „Gelöscht“ und „Modell löschen“ nicht ausgelöst.

Vorläufiges Löschen:

Die Datentabelle sollte das Feld „deled_at“ festlegen. Verweisen Sie auf das Merkmal „SoftDeletes“ im Modell und legen Sie das Feld „deleded_at“ auf das Attribut „$dates“ fest.

<?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;]; 
}

legt das Soft-Deletion-Modell fest. In der Löschmethode wird delete_at auf das aktuelle Datum und die aktuelle Uhrzeit gesetzt. Beim Abfragen vorläufig gelöschter Modelle werden vorläufig gelöschte Modelle automatisch ausgeschlossen.

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();

Das Soft-Delete-Modell verwendet erzwungenes Löschen:

$flight

-

>forceDelete() ;Abfragebereich: Abfrageeinschränkungen zum Modell hinzufügen. Es gibt zwei Typen: global und lokal:

global – bedingte Einschränkungen werden automatisch zu jeder Abfrage hinzugefügt

lokal – lokale Einschränkungen werden nach Bedarf aufgerufen.

Globaler Bereich:

Zuerst müssen Sie die Scope-Schnittstellenklasse implementieren.

<?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);
    }
}

Wenn der globale Bereich Felder zur Select-Anweisung der Abfrage hinzufügen möchte, sollten Sie dies tun Verwenden Sie die Methode

anstelle von

und wenden Sie den globalen Bereich an: addSelectselect,以免替换查询的现有select。Verwenden Sie die Methode addGlobalScope in der Boot-Methode des Modells.

<?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);
    }
}

Sie können auch Abschlüsse verwenden, um den globalen Geltungsbereich zu definieren, ohne eine separate Klasse zu definieren:

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);
        });
    }
}

Globalen Geltungsbereich löschen:

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

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

Lokaler Geltungsbereich:

定义通用的约束在需要时使用。定义方法:在模型内定义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 开发支付宝支付与提现转账的方法

Das obige ist der detaillierte Inhalt vonEinführung in das Eloquent-Modell von Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn