Laravel 关系,需要建议
Posted
技术标签:
【中文标题】Laravel 关系,需要建议【英文标题】:Laravel relationships, need advice 【发布时间】:2021-06-14 16:25:51 【问题描述】:我正在做一个使用 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);
任何想法我可以如何解决这个问题?提前谢谢!!!
【问题讨论】:
你能发布你的关系模型 你可以这样做TagResource::distinct()->get(['column_name']);
@Basharmal,我添加了关系
【参考方案1】:
首先,获取非唯一标签相当简单:
Tag::where('unique', false)->get();
如果标签太多,获取未使用的唯一标签可能是一项繁重的操作。这就是为什么在标签表中添加一个名为“used”的新列并在使用时使其成为 true 是个好主意。然后轻松获取它们:
Tag::where([['unique', '=', true], ['used', '=', false])->get();
如果你使新列可以为空,如果不是唯一的,则添加 set null,你的查询会更简单:
Tag::where('used', false)->get();
如果您不想添加新列,则需要获取所有带有场景的唯一标签并对其进行计数。
Tag::whewre('unique', true)
->with('scenarios')
->get()
->filter(function($tag)
return $tag->scenarios->count() == 0;
);
其实,Laravel 有这个操作的助手,但是我不记得了。如果我找到了,我会更新我的答案。
【讨论】:
我不认为我可以使用“used”标志,因为标签仅在项目中是唯一的,所以唯一标志也可以在另一个项目中使用。以上是关于Laravel 关系,需要建议的主要内容,如果未能解决你的问题,请参考以下文章