Laravel 5.7-用户模型上的访问器,基于一些因素来获取集合的关系

时间:2018-12-06 18:45:04

标签: php laravel laravel-5 eloquent laravel-5.7

我有一些可能与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所做的事情相同。

2 个答案:

答案 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();

这不会使用关系,但会做同样的事情,并且在处理大量数据时会表现更好。