2015-02-10 4 views
0

У меня есть следующие модели в Eloquent: группы, темы, комментарии и пользователи. Я хочу найти все комментарии в определенной группе от конкретного пользователя.Извлечение и фильтрация отношений в Laravel Eloquent

Это мой текущий подход:

$group->threads->each(function ($thread) use ($user_id) 
{ 
    $user_comments = $thread->comments->filter(function ($comment) use ($user_id) 
    { 
    return $comment->owner_id == $id; 
    }); 
}); 

Это выглядит некрасиво, как ад, вероятно, медленно, как ад, и я просто хочу, чтобы избавиться от него. Какой самый быстрый и элегантный способ в Eloquent попасть в мой результирующий набор?

+0

Вы хотите, чтобы получить все комментарии в сочетании или по цепочке потоков? – lukasgeiter

+0

Мне все равно. Все комментарии объединены. –

+0

Как вы выглядите? Потому что, если вы правильно настроили свои отношения, вы можете сделать что-то вроде $ group-> find (1) -> users()> find (1) -> comments; – Burimi

ответ

0

patricus Решение направило меня в правильном направлении. Я отправил свой вопрос в laracasts Forum и получил большую помощь от Jarek Tkaczyk, который также часто посещает этот сайт.

hasManyThrough() для Group модели путь:

public function comments() 
{ 
    return $this->hasManyThrough('ThreadComment', 'Thread'); 
} 

Там несколько предостережений, хотя:

  1. Используйте объект соотношение вместо коллекции ($group->comments(), НЕ$group->comments)
  2. Если вы используете мягкие удаления Laravel, вы не можете просто изменить get() на delete(), потому что вы получите ошибку неоднозначности для столбца updated_at. Вы тоже не можете его префикс, это просто, как работает Eloquent.

Если вы хотите удалить все комментарии из конкретного пользователя в конкретной группе вы должны сделать это немного по-другому:

$commentsToDelete = $group->comments() 
     ->where('threads_comments.owner_id', $id) 
     ->select('threads_comments.id') 
     ->lists('id'); 

ThreadComment::whereIn('id', $commentsToDelete)->delete(); 

Вы в основном выборки все соответствующие идентификаторы в первом запросе а затем пакет удалить их во втором.

1

Если group hasMany threads и thread hasMany comments, вы можете добавить еще одно отношение к группе: group hasMany comments через threads.

О группе:

public function comments() { 
    return $this->hasManyThrough('Comment', 'Thread'); 
} 

Теперь вы можете получить комментарии в группе по $group->comments;

Здесь вы можете лавировать на требования для пользователя:

$user_comments = $group->comments()->where('owner_id', $user_id)->get(); 

Если вы хотите, вы можете извлечь туда, где вы хотите, в область комментариев.

Смежные вопросы