2014-02-03 4 views
0

У меня есть модель публикации, модель пользователя и модель комментариев.Laravel 4 (.1), Eloquent и Relationships

Мои пользователи могут оставлять сообщения, а также могут комментировать сообщения.

Я хочу получать комментарии к сообщениям с сообщениями, но мои пользователи также могут блокировать пользователей.

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

И вот проблема.

$posts = $user()->posts()->get(); 

$blockedUserIdentifiers = (array) $viewer->getBlockedUserIdentifiers(); 

$posts->with(array('comments' => function($query) use ($blockedUserIdentifiers) 
{ 
    if(! empty($blockedUserIdentifiers)) 
     $query->whereNotIn('user_id', $blockedUserIdentifiers); 
}))->with('user'); // ? Ups? 

Я хочу использовать отношения сообщений, а также комментарии, потому что работа здесь не закончена. Но если я использую foreach на массиве posts, будет очень странно продолжать и; если я использую foreach на объекте posts, мне тяжело продолжать.

Потому что я заблокировал состояние Пользователя, я тоже не могу загружать загрузку.

Какова наилучшая практика моего дела или, как я должен добавить $comments объект результата в $posts объект, такой как laravel?

Или как я могу продолжать добавлять результаты отношений к этому результату?

ответ

1

Ввод ограничений на множественные отношения с with().

$posts->with(array('comments' => function($query) use ($blockedUserIdentifiers) 
{ 
    // if(! empty($blockedUserIdentifiers)) 
    //  $query->whereNotIn('user_id', $blockedUserIdentifiers); 
}, 'comments.user', function($query) use ($blockedUserIdentifiers) 
{ 
    // Constraints on the users can go here 
    if(! empty($blockedUserIdentifiers)) 
     $query->whereNotIn('id', $blockedUserIdentifiers); 
}))->get(); 

Или делать это во время эха.

foreach($posts as $post) { 
    // If you want to keep your relationships clean, you can just not echo the post instead 
    if(array_search($post->user_id, $blockedUserIdentifiers) !== false) { 
     continue; 
    } 

    echo $post->content; 
    foreach($post->comments as $comment) { 
     echo $comment->user; 
     echo $comment->content; 
    } 
} 
+0

Благодарим за ответ. Я предпочитаю использовать запросы базы данных, где это возможно. Вы знаете, производительность имеет значение. –

+0

Согласен, лучше сделать это в SQL. Я больше изменил свой ответ, чтобы показать, что здесь есть два решения. Вы пробовали первый, который добавляет еще одну связь с вашим 'with()' statment? – user3158900

+0

Я боюсь, что такой способ приведет к комментариям без пользователей? –

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