【问题标题】:How to check if collection's column matches an array如何检查集合的列是否与数组匹配
【发布时间】:2019-06-15 02:40:34
【问题描述】:
  • 模型CustomerDocuments 保存客户文档,doc_id 是此模型中的一列,表示存在哪个文档。
  • 我有一组所需的文档 ID,例如 $neededDocs = [1,2,3]

如何检查我的集合 CustomerDocuments 是否在此集合的每个项目中包含 $neededDocs

如果所有 $neededDocs 都存在于每个 CustomerDocuments.doc_id 中,则返回 true,否则返回 false。

我想用collection做这个->包含如下:

CustomersDocuments::where('customer_id', $customer->id)
    ->contains('doc_id',$required_onboarding_docs)
    ->get();

但是这个语法是错误的

【问题讨论】:

  • 您要检查每行的doc_id 是否存在于$neededDocs 中吗?
  • @Mozammil,是的。
  • @Iftikharuddin 我在那里看到了foreach,我希望避免它,因为整个目的收集方法是能够在没有额外的 foreach 的情况下运行它们,无论如何感谢链接。跨度>
  • 我很困惑。我的印象是您想检查您的客户文档结果是否包含您在$neededDocs 中指定的文档。我更新了我的答案。这是你要找的吗?

标签: laravel


【解决方案1】:

我认为您可以通过以下方式实现此目的:

$documents = CustomersDocuments::where('customer_id', $customer->id)
    ->get()
    ->pluck('doc_id')
    ->toArray();

上面将输出一个包含所有doc_id的数组。

return $documents == $neededDocs; 

然后您可以将其与您的 $neededDocs 数组进行比较。

编辑:但是,如果您想检查集合中的每一行是否包含doc_id 存在于$neededDocs 中,您可以这样做:

$collection = CustomersDocuments::where('customer_id', $customer->id)->get(); 

return $collection->contains(function($value, $key) use ($neededDocs) {
    return in_array($value->doc_id, $neededDocs); 
}); 

我不完全确定您想要哪一个,但这些应该可以解决问题。

【讨论】:

  • Mozammil,感谢您的努力,新编辑返回 true 作为数组中的项目数(不好)。但我选择了你的第一个答案,比较数组......不是很优雅,但它有效:)
  • 第二种情况解决了一个完全不同的用例。在第一种情况下,我们正在检查您的结果是否等于您需要的结果。在第二种情况下,我们正在检查每一行是否真的是您需要的文档。它可能有数百个文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
相关资源
最近更新 更多