口才:如何从集合中获取与指定集合中所有项目相关的值?

问题描述

我不确定该如何表达自己想要实现的目标,因此我将仅通过示例进行演示。

假设我们有标签和对象。标签和对象之间存在多对多关系。 示例:

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标记循环中检入以查找与对象之间的关系。如果它与对象数匹配,则与所有对象相关。 (这是假设每个标记到对象的关系都是唯一的,应该这样)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...