我有一个类似下面的laravel集合:
[
{
"id":2,
"name":"Product 1",
"awards":[
{
"id":1,
"name":"Award 1",
"pivot":{
"product_id":2,
"award_id":1
}
},
{
"id":2,
"name":"Award 2",
"description":"Quae sint vero id iste.",
"pivot":{
"product_id":2,
"award_id":2
}
},
{
"id":3,
"name":"Award 3",
"pivot":{
"product_id":2,
"award_id":3
}
},
]
},
{
"id":3,
"name":"Product 2",
"awards":[
{
"id":2,
"name":"Award 2",
"pivot":{
"product_id":3,
"award_id":12
}
},
{
"id":3,
"name":"Award 3",
"pivot":{
"product_id":3,
"award_id":13
}
},
{
"id":14,
"name":"Award 4",
"pivot":{
"product_id":3,
"award_id":14
}
},
]
}
]
有没有办法可以获得如下所示的集合,所有奖项,没有重复:
"awards":[
{
"id":1,
"name":"Award 1",
"pivot":{
"product_id":2,
"award_id":1
}
},
{
"id":2,
"name":"Award 2",
"description":"Quae sint vero id iste.",
"pivot":{
"product_id":2,
"award_id":2
}
},
{
"id":3,
"name":"Award 3",
"pivot":{
"product_id":2,
"award_id":3
}
},
{
"id":12,
"name":"Award 2",
"pivot":{
"product_id":3,
"award_id":12
}
},
{
"id":14,
"name":"Award 4",
"pivot":{
"product_id":3,
"award_id":14
}
},
]
我知道Laravel集合类有很多方法(比如过滤器等),但是我很难让它们跨越对象工作 - 例如在这里我有两个我几乎想要的对象< / p>
combine('awards')->unique()
......有点儿。
我得到的初始阵列非常简单,一个包含许多产品的盒子和产品都有奖项,所以我想说,这个盒子总共有x,y,z奖。无论如何,这是查询(以上是return $box
的结果):
$box = Box::with('products.awards')->find($id);
答案 0 :(得分:5)
这是真正简单的方法。
$awardsArray = $products->lists('awards');
$awardsDirty = new Collection($awardsArray);
$awards = $awardsDirty->unique();
答案 1 :(得分:1)
这是我能想到的最佳方式:
$awards = new \Illuminate\Database\Eloquent\Collection;
foreach($products as $product){
$awards = $awards->merge($product->awards);
}
关于merge
和Eloquent集合的好处是它们使用id作为唯一标识符,因此您的副本将被自动删除。
答案 2 :(得分:1)
在Laravel版本 5.2 之后,collection->lists()
已被标记为已弃用方法。替代解决方案将是:
$awards = collect($products)
->pluck("awards")
->flatten(1)
->unique("id");