20 Laravel Eloquent 提示和技巧
Eloquent ORM 看起来像一个简单的机制,但在幕后,有很多半隐藏的功能和不太知名的方法来实现更多。在本文中,我将向您展示一些技巧。
1. Increments and Decrements
**文章阅读量增加 1 **
$article = Article::find($articleid);
$article->readcount++;
$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
2. XorY methods
Eloquent有很多功能,结合了两种方法,比如“请做X,否则做Y”。
Example 1 – findOrFail():
$user = User::findOrFail($id);
等价于:
$user = User::find($id);
if (!$user) { abort (404); }
Example 2 – firstOrCreate():
$user = User::firstOrCreate(['email' => $email]);
等价于:
$user = User::where('email', $email)->first();
if (!$user) {
User::create(['email' => $email]);
}
3.模型 boot() 方法:
在Eloquent模型中有一个名为boot()的方法,您可以在其中覆盖默认行为:
可能最常见的例子之一是在创建模型对象时设置一些字段值。假设你想在那一刻生成UUID字段。
4.Relationship with conditions and ordering
这是定义关系的典型方法:
但是你知道吗,此时我们已经可以添加where或orderBy了!
例如,如果您想要某种类型的用户(也是通过电子邮件订购)的特定关系,您可以这样做:
5.模型属性:timestamps, appends等。
Eloquent模型有一些“参数”,以该类的属性形式出现。最受欢迎的可能是这些:
更多请查看默认abstract Model class 的代码,并查看所有使用的特征。
6. find()
大家都知道find()方法可以这样用:
$user=User::find(1);
其实find()还可以传递一个数组作为参数:
$users=User::find([1,2,3]);
7.whereX
有一种优雅的方式可以解决这个问题:
$users=User::where('approved', 1)->get();
等价于:
$users=User::whereApproved(1)->get();
8.Order by relationship
一个更复杂的“技巧”。如果您有论坛主题但想通过最新帖子订购,该怎么办?顶部有最新更新主题的论坛中非常常见的要求,对吧?
首先,描述关于该主题的最新帖子的单独关系:
public function latestPost()
{
return $this->hasOne(\App\Post::class)->latest();
}
然后,在我们的控制器中,我们可以这样做:
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
9.Eloquent::when() – no more if-else’s
我们中的许多人用“if-else”编写条件查询,如下所示:
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'));
}
但有更好的方法 - 使用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'));
});
它可能不会感觉更短或更优雅,但最强大的是传递参数:
$query = User::query();
$query->when(request('role', false), function ($q, $role) {
return $q->where('role_id', $role);
});
$authors = $query->get();
10.BelongsTo Default Models
假设你有Post属于Author,然后是Blade代码:
{{ $post->author->name }}
但是如果作者被删除,或者由于某种原因没有设置呢?您将收到错误,例如“property of non-object”。
当然,您可以像这样阻止它:
{{ $post->author->name ?? '' }}
但你可以在Eloquent关系层面上做到这一点:
public function author()
{
return $this->belongsTo('App\Author')->withDefault();
}
在此示例中,如果没有作者附加到帖子,则author()关系将返回空的App \ Author模型。
此外,我们可以将默认属性值分配给该默认模型。
public function author()
{
return $this->belongsTo('App\Author')->withDefault([
'name' => 'Guest Author'
]);
}
11.
`单行代码`
, 更多语法请见这里 Markdown 语法