Heim > Artikel > PHP-Framework > Wichtige praktische Tipps für Laravel Eloquent
Notwendige praktische Fähigkeiten für Laravel Eloquent
1. Inkrementieren und Dekrementieren
Um die folgende Implementierung zu ersetzen:
$article = Article::find($article_id); $article->read_count++; $article->save();
Sie können dies tun:
$article = Article::find($article_id); $article->increment('read_count');
Die folgenden Methoden können ebenfalls implementiert werden:
Article::find($article_id)->increment('read_count'); Article::find($article_id)->increment('read_count', 10); // +10 Product::find($produce_id)->decrement('stock'); // -1
2. Methode ausführen Verwenden Sie zum Beispiel „Bitte führen Sie zuerst Methode X aus. Wenn Methode X fehlschlägt, führen Sie Methode Y aus.“
Beispiel 1 – findOrFail():
Um die Implementierung des folgenden Codes zu ersetzen:
$user = User::find($id); if (!$user) { abort (404); }
Sie können so schreiben:
$user = User::findOrFail($id);
Beispiel 2 -- firstOrCreate():
Um die Implementierung des folgenden Codes zu ersetzen:
$user = User::where('email', $email)->first(); if (!$user) { User::create([ 'email' => $email ]); }
Schreiben Sie es einfach so:
$user = User::firstOrCreate(['email' => $email]);
3 Die boot()-Methode des Modells
In einem Eloquent-Modell gibt es einen magischen Ort namens boot(), an dem Sie das Standardverhalten überschreiben können:
class User extends Model { public static function boot() { parent::boot(); static::updating(function($model) { // 写点日志啥的 // 覆盖一些属性,类似这样 $model->something = transform($something); }); } }
Legen Sie die Werte bestimmter Felder fest, wenn Sie das Modellobjekt erstellen. wahrscheinlich das beliebteste Beispiel. Schauen wir uns an, was zu tun ist, wenn Sie beim Erstellen eines Modellobjekts ein UUID-Feld generieren möchten.
public static function boot() { parent::boot(); self::creating(function ($model) { $model->uuid = (string)Uuid::generate(); }); }
4. Assoziation mit Bedingungen und Sortierung
Allgemeine Art und Weise, Assoziationen zu definieren:
public function users() { return $this->hasMany('App\User'); }
Wissen Sie? Sie können basierend auf dem oben Gesagten auch „where“ oder „orderBy“ hinzufügen.
Wenn Sie beispielsweise bestimmte Benutzertypen zuordnen und das E-Mail-Feld zum Sortieren verwenden möchten, können Sie Folgendes tun:
public function approvedUsers() { return $this->hasMany('App\User')->where('approved', 1)->orderBy('email'); }
5. Modellfunktionen: Zeit, Anhängen usw.
Einige Parameter des Eloquent-Modells liegen in Form von Klassenattributen vor. Die am häufigsten verwendeten sind:
class User extends Model { protected $table = 'users'; protected $fillable = ['email', 'password']; // 可以被批量赋值字段,如 User::create() 新增时,可使用字段 protected $dates = ['created_at', 'deleted_at']; // 需要被Carbon维护的字段名 protected $appends = ['field1', 'field2']; // json返回时,附加的字段 }
Nicht nur diese, sondern auch:
protected $primaryKey = 'uuid'; // 更换主键 public $incrementing = false; // 设置 不自增长 protected $perPage = 25; // 定义分页每页显示数量(默认15) const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; //重写 时间字段名 public $timestamps = false; // 设置不需要维护时间字段
Weitere Informationen finden Sie in der Zusammenfassung der Modellklasse.
6. Mehrere Datensätze nach ID abfragen
Jeder kennt die Methode find(), oder?
$user = User::find(1);
Ich bin sehr überrascht, dass nur wenige Leute wissen, dass diese Methode Arrays mit mehreren IDs als Parameter akzeptieren kann:
$users = User::find([1,2,3]);
WobeiX
Es gibt einen eleganten Weg dazu Art von Code:
$users = User::where('approved', 1)->get();
wird in diese Art von Code umgewandelt:
$users = User::whereApproved(1)->get();
Ja, Sie haben es richtig gelesen, verwenden Sie den Feldnamen als Suffix und fügen Sie ihn nach „wo“ hinzu, und es wird ausgeführt durch die magische Methode.
Darüber hinaus gibt es in Eloquent einige vordefinierte Methoden, die sich auf die Zeit beziehen:
User::whereDate('created_at', date('Y-m-d')); User::whereDay('created_at', date('d')); User::whereMonth('created_at', date('m')); User::whereYear('created_at', date('Y'));
8 Sortieren nach Beziehung
Eine kompliziertere „Technik“. Möchten Sie Forenthemen nach den neuesten Beiträgen sortieren? Es ist eine allgemeine Anforderung, die zuletzt aktualisierten Themen in einem Forum ganz oben zu haben, oder?
Definieren Sie zunächst eine separate Beziehung für den neuesten Beitrag des Themas:
public function latestPost() { return $this->hasOne(\App\Post::class)->latest(); }
Dann können wir im Controller diese „Magie“ implementieren:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
Eloquent: :when() – Kein if-else mehr verwenden
Viele Leute verwenden gerne „if-else“, um Abfragebedingungen zu schreiben, wie folgt:
if (request('filter_by') == 'likes') { $query->where('likes', '>', request('likes_amount', 0)); } if (request('filter_by') == 'date') { $query->orderBy('created_at', request('ordering_rule', 'desc')); }
Es gibt einen besseren Weg Methode- -use when()
$query = Author::query(); $query->when(request('filter_by') == 'likes', function ($q) { return $q->where('likes', '>', request('likes_amount', 0)); }); $query->when(request('filter_by') == 'date', function ($q) { return $q->orderBy('created_at', request('ordering_rule', 'desc')); });
Es sieht vielleicht nicht sehr elegant aus, aber seine leistungsstarke Funktion besteht darin, Parameter zu übergeben:
$query = User::query(); $query->when(request('role', false), function ($q, $role) { return $q->where('role_id', $role); }); $authors = $query->get();
10. Gehört zum Standardmodell
Wenn es eine gibt Post-Modell an das Autorenmodell angehängt, und der folgende Code kann in die Blade-Vorlage geschrieben werden:
{{ $post->author->name }}
Aber was ist, wenn der Autor gelöscht oder aus irgendeinem Grund nicht festgelegt wird? Sie erhalten eine Fehlermeldung wie „nicht vorhandene Objekteigenschaft“.
Nun, Sie können es so vermeiden:
{{ $post->author->name ?? '' }}
Aber Sie können dies auf der Ebene des Eloquent-Relationalmodells tun:
public function author() { return $this->belongsTo('App\Author')->withDefault(); }
In diesem Beispiel, wenn der Beitrag nein hat Autor Andernfalls gibt die Beziehungsmethode „author()“ ein leeres AppAuthor-Modellobjekt zurück.
Darüber hinaus können wir dem Standardmodell auch einen Standardattributwert zuweisen.
public function author() { return $this->belongsTo('App\Author')->withDefault([ 'name' => 'Guest Author' ]); }
11. Sortierung nach Zuweisungsfunktion
Stellen Sie sich vor, Sie haben diesen Code:
function getFullNameAttribute() { return $this->attributes['first_name'] . ' ' . $this->attributes['last_name']; }
Sie möchten jetzt nach „vollständiger_Name“ sortieren?
$clients = Client::orderBy('full_name')->get(); //没有效果
Die Lösung ist einfach. Wir müssen die Ergebnisse sortieren, nachdem wir sie erhalten haben.
$clients = Client::get()->sortBy('full_name'); // 成功!
Beachten Sie, dass die Methodennamen unterschiedlich sind – es ist nicht orderBy, sondern sortBy
12. Standardsortierung im globalen Bereich
Was ist, wenn Sie möchten, dass User::all() immer nach dem Namensfeld sortiert? Sie können ihm einen globalen Geltungsbereich zuweisen. Kehren wir zur oben erwähnten boot()-Methode zurück:
protected static function boot() { parent::boot(); // 按照 name 正序排序 static::addGlobalScope('order', function (Builder $builder) { $builder->orderBy('name', 'asc'); }); }
Erweiterter Leseabfragebereich.
13. Native Abfragemethode
Manchmal müssen wir native Abfragen zu Eloquent-Anweisungen hinzufügen. Zum Glück gibt es einen Weg.
// whereRaw $orders = DB::table('orders') ->whereRaw('price > IF(state = "TX", ?, 100)', [200]) ->get(); // havingRaw Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get(); // orderByRaw User::where('created_at', '>', '2016-01-01') ->orderByRaw('(updated_at - created_at) desc') ->get();
14. Eine Kopie einer Zeile zu erstellen
ist einfach. Die Erklärung ist nicht sehr ausführlich, aber hier ist der beste Weg, eine Datenbankentität (ein Datenelement) zu kopieren:
$task = Tasks::find(1); $newTask = $task->replicate(); $newTask->save();
15. Methode für große Datenmengen
ist nicht vollständig mit Eloquent verwandt, es geht eher um Sammlung (Sammlung), ist aber dennoch sehr nützlich für die Verarbeitung großer Datensammlungen. Sie können chunk() verwenden, um diese Daten in kleine Datenblöcke aufzuteilen.
Vor der Änderung:
$users = User::all(); foreach ($users as $user) { // ...
Sie können Folgendes tun:
User::chunk(100, function ($users) { foreach ($users as $user) { // ... } });
16 Operation
Wir alle kennen diesen Artisan-Befehl:
php artisan make:model Company
Aber Sie wissen, dass es drei sehr nützliche Bezeichner gibt, die zum Generieren modellbezogener Dateien
php artisan make:model Company -mcr
-m Erstellen verwendet werden können Migrationsdatei
-c Controller-Datei erstellen
-r Ressourcenbetriebsmethode zum Controller hinzufügen
17 Geben Sie beim Aufruf der Speichermethode „update_at“ an
你知道 ->save() 方法可以接受参数吗? 我们可以通过传入参数阻止它的默认行为:更新 updated_at 的值为当前时间戳。
$product = Product::find($id); $product->updated_at = '2019-01-01 10:00:00'; $product->save(['timestamps' => false]);
这样,我们成功在 save 时指定了 updated_at 的值。
18. update() 的结果是什么?
你是否想知道这段代码实际上返回什么?
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
我是说,更新操作是在数据库中执行的,但 $result 会包含什么?
答案是受影响的行。 因此如果你想检查多少行受影响, 你不需要额外调用其他任何内容 -- update() 方法会给你返回此数字。
19. 把括号转换成 Eloquent 查询
如果你有个 and 和 or 混合的 SQL 查询,像这样子的:
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
怎么用 Eloquent 来翻译它呢? 下面是一种错误的方式:
$q->where('gender', 'Male'); $q->orWhere('age', '>=', 18); $q->where('gender', 'Female'); $q->orWhere('age', '>=', 65);
顺序就没对。正确的打开方式稍微复杂点,使用闭包作为子查询:
$q->where(function ($query) { $query->where('gender', 'Male') ->where('age', '>=', 18); })->orWhere(function($query) { $query->where('gender', 'Female') ->where('age', '>=', 65); })
20. 复数参数的 orWhere
终于,你可以传递阵列参数给 orWhere()。平常的方式:
$q->where('a', 1); $q->orWhere('b', 2); $q->orWhere('c', 3);
你可以这样做:
$q->where('a', 1); $q->orWhere(['b' => 2, 'c' => 3]);
更多laravel框架相关技术文章,请访问laravel教程栏目!
Das obige ist der detaillierte Inhalt vonWichtige praktische Tipps für Laravel Eloquent. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!