我有一些可能与items
相关的用户,并且我想创建一个getItemDatesAttribute
访问器,该访问器将获取所有与用户相关的项目并获得这些项目的日期。在这种情况下,用户和日期之间没有直接关系。我可以得到相关物品:
/**
* Accessor to get a user's relevant item dates
*
* @return mixed
*/
public function getItemDatesAttribute()
{
$itemDates = Item::where('assigned_user_id', $this->id)
->orWhereIn('assigned_team_id', $this->teams->pluck('id'))
->with('dates')
->get();
dd($itemDates); // All the bugs with their dates if they have them...
$itemDates->filter(function ($item) {
// Not sure how to return just the dates
});
}
然后,我不太确定如何返回所有相关错误的所有日期。 Item
模型具有以下关系:
public function dates()
{
return $this->hasMany(ItemDate::class, 'item_id', 'id');
}
最终结果应该是通过上述几个因素(以及任何其他需要的因素)与用户相关的日期的集合。我知道我可以使用一些嵌套的foreach来实现,但是想知道是否有更好的laravel方法:
$items = Item::all();
foreach ($items as $item) {
if ($item->isRelative && !empty($item->dates)) {
foreach ($item->dates as $item) {
$dates[] = $date;
}
}
}
return $dates;
isRelative是对Item的访问器,它与我在第一个查询中的where / whereIn所做的事情相同。
答案 0 :(得分:1)
最终很清楚地发现了这一点:
$relativeItems = Item::relativeTo($this)->with('dates')->active()->get();
return $relativeItems->pluck('dates')->flatten();
relativeTo()
和active()
方法是Item模型的作用域。
答案 1 :(得分:0)
您可以使用联接来实现,并选择类似的内容
Item::join('item_dates', 'item.id', '=', item_dates.item_id')
->where('assigned_user_id', $this->id)
->orWhereIn('assigned_team_id', $this->teams->pluck('id') )
->selectRaw('item.id, item_dates.*')
->get();
这不会使用关系,但会做同样的事情,并且在处理大量数据时会表现更好。