$article = Article::find($article_id); $article->read_count++; $article->save();
$article = Article::find($article_id); $article->increment('read_count');
Article::find($article_id)->increment('read_count'); Article::find($article_id)->increment('read_count', 10); // +10 Product::find($produce_id)->decrement('stock'); // -1
:
Um die Implementierung des folgenden Codes zu ersetzen: findOrFail()
$user = User::find($id); if (!$user) { abort (404); }
$user = User::findOrFail($id);
:
Um die Implementierung des folgenden Codes zu ersetzen: firstOrCreate()
$user = User::where('email', $email)->first(); if (!$user) { User::create([ 'email' => $email ]); }
$user = User::firstOrCreate(['email' => $email]);
class User extends Model { public static function boot() { parent::boot(); static::updating(function($model) { // 写点日志啥的 // 覆盖一些属性,类似这样 $model->something = transform($something); }); } }
Legen Sie den Wert bestimmter Felder fest, wenn Sie das Modellobjekt erstellen, wahrscheinlich das Die meisten Eines der beliebtesten Beispiele. Schauen wir uns an, was Sie tun sollten, wenn Sie beim Erstellen eines Modellobjekts ein UUID-Feld generieren möchten. boot()
public static function boot() { parent::boot(); self::creating(function ($model) { $model->uuid = (string)Uuid::generate(); }); }
public function users() { return $this->hasMany('App\User'); }
oder
? auf der Grundlage des oben Gesagten hinzufügen. Wenn Sie beispielsweise bestimmte Benutzertypen zuordnen und das E-Mail-Feld zum Sortieren verwenden möchten, können Sie Folgendes tun: where
public function approvedUsers() { return $this->hasMany('App\User')->where('approved', 1)->orderBy('email'); }
orderBy
5. Modellfunktionen: Zeit, Anhängen usw. 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返回时,附加的字段 }
protected $primaryKey = 'uuid'; // 更换主键 public $incrementing = false; // 设置 不自增长 protected $perPage = 25; // 定义分页每页显示数量(默认15) const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; //重写 时间字段名 public $timestamps = false; // 设置不需要维护时间字段
$user = User::find(1);
Ich bin sehr überrascht, dass nur wenige Leute wissen, dass diese Methode Arrays mit mehreren IDs als Parameter akzeptieren kann: find()
$users = User::find([1,2,3]);
$users = User::where('approved', 1)->get();
$users = User::whereApproved(1)->get();
hinzu , und es wird die magische Methode durchlaufen.
Darüber hinaus gibt es in Eloquent einige vordefinierte Methoden in Bezug auf die Zeit: where
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'));
public function latestPost() { return $this->hasOne(\App\Post::class)->latest(); }
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
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')); }
$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: when()
$query = User::query(); $query->when(request('role', false), function ($q, $role) { return $q->where('role_id', $role); }); $authors = $query->get();
Angenommen, Sie möchten den Autor des Artikels anzeigen, dann lautet der Vorlagencode:
{{ $post->author->name }}
{{ $post->author->name ?? '' }}
public function author() { return $this->belongsTo('App\Author')->withDefault(); }
wird ein leeres
Modellobjekt zurückgeben.author()
Darüber hinaus können wir den Eigenschaften im Standardmodellobjekt auch Standardwerte zuweisen. AppAuthor
public function author() { return $this->belongsTo('App\Author')->withDefault([ 'name' => 'Guest Author' ]); }
function getFullNameAttribute() { return $this->attributes['first_name'] . ' ' . $this->attributes['last_name']; }
$clients = Client::orderBy('full_name')->get(); //没有效果
$clients = Client::get()->sortBy('full_name'); // 成功!
-Methode zurück: User::all()
protected static function boot() { parent::boot(); // 按照 name 正序排序 static::addGlobalScope('order', function (Builder $builder) { $builder->orderBy('name', 'asc'); }); }
name
Extended reading Query Scope . boot()
有时候,我们需要在 Eloquent 语句中添加原生查询。 幸运的是,确实有这样的方法。
// 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();
很简单。说明不是很深入,下面是复制数据库实体(一条数据)的最佳方法:
$task = Tasks::find(1); $newTask = $task->replicate(); $newTask->save();
与 Eloquent 不完全相关,它更多的关于 Collection (集合),但是对于处理大数据集合,仍然是很有用的。你可以使用 chunk() 将这些数据分割成小数据块
修改前:
$users = User::all(); foreach ($users as $user) { // ...
你可以这样做:
User::chunk(100, function ($users) { foreach ($users as $user) { // ... } });
我们都知道Artisan命令:
php artisan make:model Company
但是,你知道有三个有用的标记可以为模型生成相关文件吗?
php artisan make:model Company -mcr
-m 将创建一个迁移文件
-c 将创建一个控制器
-r 表示控制器应该是一个资源控制器
你知道 ->save()
方法可以接受参数吗? 我们可以通过传入参数阻止它的默认行为:更新 updated_at
的值为当前时间戳。
$product = Product::find($id); $product->updated_at = '2019-01-01 10:00:00'; $product->save(['timestamps' => false]);
这样,我们成功在 save
时指定了 updated_at
的值。
你是否想知道这段代码实际上返回什么?
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
我是说,更新操作是在数据库中执行的,但 $result
会包含什么?
答案是受影响的行。 因此如果你想检查多少行受影响, 你不需要额外调用其他任何内容 -- update()
方法会给你返回此数字。
如果你有个 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); })
终于,你可以传递阵列参数给 orWhere()
。平常的方式:
$q->where('a', 1); $q->orWhere('b', 2); $q->orWhere('c', 3);
你可以这样做:
$q->where('a', 1); $q->orWhere(['b' => 2, 'c' => 3]);
我很确定还有更多隐藏的秘诀,但我希望至少上面的其中一些对你来说是新的。
推荐教程:《Laravel教程》
Das obige ist der detaillierte Inhalt vonHäufig verwendete Laravel Eloquent wesentliche praktische Fähigkeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!