问题描述
我不确定该如何表达自己想要实现的目标,因此我将仅通过示例进行演示。
假设我们有标签和对象。标签和对象之间存在多对多关系。 示例:
Object1具有标签A,B和C。 Object2具有标签A,D和E。 Object3有一个标签-A。
我想获取在所有这些对象中找到的所有标记(在此示例中,我指定了3,但是可以有N个对象)。结果应包含一个标签集合,其中仅包含标签A,因为这是在所有3个对象中都可以找到的唯一标签。
我该如何实现?谢谢,使用口才的例子是完美的。
解决方法
经过几个小时的研究,我终于找到了想要的东西。它被称为交集,而laravel有这样的集合方法。 https://laravel.com/docs/7.x/collections#method-intersect
这就是我最终得到的:
$tags = Tag::whereHas('objects',function($q) use($request){
return $q->whereIn('dynamic_abstract_objects.id',$request->input('objects',[]));
})->get(); //first we get all the tags that belong to all provided objects
//then we iterate over each object to get it's tags
foreach($request->input('objects',[]) as $objectId){
$objectTags = DynamicAbstractObject::where('id',$objectId)->first()->tags()->get();
$intersection = $objectTags->intersect($tags);
$tags = $intersection; //we assign intersection result for further loops
}
return $tags;
,
一种方法是查询标签与对象的关系。通过知道对象的数量,您可以在foreach标记循环中检入以查找与对象之间的关系。如果它与对象数匹配,则与所有对象相关。 (这是假设每个标记到对象的关系都是唯一的,应该这样)。