laravel - Laravel 关系,需要建议
问题描述
我正在做一个使用 Laravel 8/Eloquent 的项目,我有以下模型和关系:
一个项目有很多场景,一个场景属于一个标签。
我收到了一个新要求,一些标签每个项目只能使用一次(仅适用于一个场景)。
我的方法是在标签表中添加一个名为“unique”的新列,这样我就知道这个标签只能使用一次:
id | name | unique | created_at
-----------------------------------------
1 | ADPDF | false | 2017-01-30 13:22:39
-----------------------------------------
2 | ADPDF_FINAL | true | 2017-01-30 13:23:42
我正在使用 TagController 向客户端发送所有标签,现在我需要一种方法来仅发送非唯一标签或标签是唯一且未使用的。
我当前的控制器方法:
public function index(Request $request) {
return TagResource::collection(Tag::all());
}
关系:
class Project extends Model
{
use HasFactory, Historyable;
public function scenarios() {
return $this->hasMany(Scenario::class);
}
}
class Scenario extends Model
{
use HasFactory, Historyable;
public function tag() {
return $this->belongsTo(Tag::class);
}
}
class Tag extends Model
{
use HasFactory;
public function scenarios() {
return $this->hasMany(Scenario::class);
}
}
知道如何解决这个问题吗?提前致谢!!!
解决方案
首先,获取非唯一标签相当简单:
Tag::where('unique', false)->get();
如果标签太多,获取未使用的唯一标签可能是一项繁重的操作。这就是为什么在标签表中添加一个名为“used”的新列并在使用时使其成为 true 是个好主意。然后轻松获取它们:
Tag::where([['unique', '=', true], ['used', '=', false])->get();
如果您将新列设为可为空,则添加 set null if not-unique,您的查询将更简单:
Tag::where('used', false)->get();
如果您不想添加新列,则需要获取所有带有场景的唯一标签并对其进行计数。
Tag::whewre('unique', true)
->with('scenarios')
->get()
->filter(function($tag) {
return $tag->scenarios->count() == 0;
});
其实,Laravel 有这个操作的助手,但我不记得了。如果我找到,我会更新我的答案。
推荐阅读
- apache-spark - 我不能让蜂巢用火花运行工作
- c# - 根据对象列表创建 key:value Json
- javascript - MongoDB聚合查找,无记录
- linux - 使用 find 复制文件时如何保留最后一个目录结构
- android - 如何从底部应用栏布局中隐藏浮动操作按钮
- javascript - 如何从 Create React App /build 文件夹制作 npm 包?
- ios - 如何在 UIImageView 中获取 UIImage 的 x 和 y 位置?
- angular - 在我的 Angular 项目中实现 webassembly
- kubernetes - 速率限制不限制任何东西
- x86 - 今天的 BIOS 怎么能大于 64KB?