Построение сложного Eloquent запроса с использованием отношения ownToMany, внешней таблицы и whereIn () - PullRequest
0 голосов
/ 14 мая 2019

В приложении Laravel 5 у меня есть 5 таблиц - пользователи, книги, авторы, подписчики и activity_feeds.

Пользователи могут подписываться на авторов, а книга может иметь несколько авторов.Когда создается книга, создается запись activity_feeds, которая ссылается на идентификатор book_id.

Мне нужно создать красноречивый запрос, чтобы получить коллекцию активность_фидов для каждого пользователя, чтобы перебирать в фиде активности их домашней страницы.

Модель My Book включает в себя

public function authors()
  {
     return $this->belongsToMany('App\Author')->withTimestamps();
  }

Таблица activity_stream выглядит следующим образом (с примерами данных)

id (1)
user_id (3)
type (New Book)
book_id (18)
created_at etc

, а мой контроллер пользователя включает

public function feedItems()
  {
    return $this->hasMany('App\ActivityFeed');
  }

public function userFollowings()
  {
    return $this->belongsToMany('App\User', 'followers', 'follower_id', 'subject_id')->withTimestamps();
  }

public function authorFollowings()
  {
     return $this->belongsToMany('App\Author', 'followers', 'follower_id', 'author_id')->withTimestamps();
  }

Мой текущий запрос (который не работает), содержащийся в модели User:

public function getactivityFeedsAttribute()
{
   $userFollowings = $this->userFollowings()->pluck('subject_id')->toArray();
   $authorFollowings = $this->authorFollowings()->pluck('author_id')->toArray();

   $userFeeds = ActivityFeed::whereIn('user_id', $userFollowings)
                             ->orwhereIn('book_id', function($query){
                               $query->select('id')
                                ->from(with(new Book)->getTable())
                                ->whereHas->authors()
                                ->whereIn('id', $authorFollowings);
                                })
                              ->get();
  return $userFeeds;
}

$ userFollowings и $ authorFollowings работают нормально.

Я не уверен, что я 'Я использую правильный синтаксис для data [book_id], чтобы вытащить идентификатор книги из строки activity_feeds, и я действительно не уверен, смогу ли я вложить в таблицу поиск или использовать $ query как этот.Это также кажется ОЧЕНЬ сложным.Могу ли я упустить что-то гораздо более прямолинейное?

В блейде, который я так называю

@forelse ($user->activityFeeds as $activityFeed)
  <div class="row">
    <div class="col-2">
      {{ $activityFeed->user->firstname }}
    </div>
    <div class="col-2">
      {{ $activityFeed->type }}
    </div>
  </div>
  <hr>
@empty
    No activity yet
@endforelse

, который работает, если я просто запрашиваю 'ActivityFeed :: whereIn (' user_id ',$ userFollowings) '

1 Ответ

0 голосов
/ 15 мая 2019

Я перепишу запрос в ответе, потому что комментарии не очень разборчивы.

public function getactivityFeedsAttribute()
{
    $userFollowings = $this->userFollowings()->pluck('subject_id')->toArray();
    $authorFollowings = $this->authorFollowings()->pluck('author_id')->toArray();
    $books = Book::whereHas('authors', function ($query) use ($authorFollowings) {
        // Have to be explicit about which id we're talking about
        // or else it's gonna throw an error because it's ambiguous
        $query->whereIn('authors.id', $authorFollowings);
    })->pluck('id')->toArray();

    $userFeeds = ActivityFeed::whereIn('user_id', $userFollowings)
    ->orwhereIn('book_id', $books)
    ->get();

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