Laravel 5.7 - средство доступа к пользовательской модели для получения взаимосвязей коллекции на основе нескольких факторов - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть пользователи, которые могут быть связаны с 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 голосов
/ 07 декабря 2018

Закончилось довольно просто:

$relativeItems = Item::relativeTo($this)->with('dates')->active()->get();
return $relativeItems->pluck('dates')->flatten();

Методы relativeTo() и active() являются областями действия для модели Item.

0 голосов
/ 06 декабря 2018

Вы можете достичь этого с помощью объединения и выбрать что-то вроде этого

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

Это не использует отношения, но делает то же самое и будет лучше работать с большими объемами данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...