20 Laravel Eloquent 提示和技巧
2

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()的方法,您可以在其中覆盖默认行为:
file
可能最常见的例子之一是在创建模型对象时设置一些字段值。假设你想在那一刻生成UUID字段。
file

4.Relationship with conditions and ordering
这是定义关系的典型方法:
file
但是你知道吗,此时我们已经可以添加where或orderBy了!
例如,如果您想要某种类型的用户(也是通过电子邮件订购)的特定关系,您可以这样做:
file

5.模型属性:timestamps, appends等。
Eloquent模型有一些“参数”,以该类的属性形式出现。最受欢迎的可能是这些:
file
file
更多请查看默认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.

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!