2016-03-12 1 views
0

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

В настоящее время мои модели выглядят следующим образом:

User.php

class User extends Model 
{ 
    // Grab all the beers that this user has checked in to his personal profile 
    public function beers() 
    { 
     return $this->belongsToMany('App\Beer')->withTimestamps()->withPivot('rating', 'description'); 
    } 
} 

Beer.php (ось отношения)

class Beer extends Model 
{ 
    // polymorphic relationship grab all comments that belong to this beer 
    public function comments() 
    { 
     return $this->morphMany('App\Comment', 'commentable'); 
    } 
} 

Comment.php (установить как полиморфный)

class Comment extends Model 
{ 
    public function commentable() 
    { 
     return $this->morphTo(); 
    } 

    public function user() 
    { 
     return $this->belongsTo('App\User'); 
    } 
} 

В этом коде содержатся все комментарии, принадлежащие записи пива. Это прекрасно работает, потому что $ user-> beers учитывает, что мы имеем дело с определенным профилем пользователя и только находит сводные записи от конкретного пользователя $.

$user = User::find($id); 

@foreach($user->beers as $beer) 
    @foreach($beer->comments as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 

К сожалению, комментарии отношение выглядит только на commentable_id и commentable_type из таблицы комментариев и не принимает во внимание текущую user_id (профиль мы сейчас просматриваем), поэтому, когда я смотрю на другой профиль пользователя, имеет такую ​​же пивоваренную комбинацию beer_user в своем профиле, что и те же комментарии.

Как можно связать отношения комментариев с моей моделью Beer.php, чтобы я также учитывал user_id? Очевидно, я уже добавил user_id в мою таблицу комментариев. Я пытался это задать раньше, но надеюсь, что, будучи немного более подробным, на этот раз люди могут помочь мне сейчас, я также знаю, как окончательно сформулировать эту проблему немного лучше.

База данных:

enter image description here

+0

пытались ли вы приковать ваш запрос, такие как $ Пиво-> комментарии() -> где «user_id», «=», $ user-> идентификатор ()? Кстати, вы собираетесь иметь комментарии пользователей? Если вы просто хотите сделать Комментарии доступными для Beers пользователями, вам не нужны отношения морфа. – Bartu

+1

Не понимаю. Какой запрос вы хотите реализовать? – nextt1

+0

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

ответ

1

В этом конкретном примере кода, я бы просто использовать жадную загрузку с ограничением по идентификатору пользователя:

$user = User::with(['beers', 'beers.comments' => function ($query) use ($id) { 
    $query->whereHas('user', function ($query) use ($id) { 
     $query->where('id', $id); 
    }); 
}])->find($id); 

@foreach($user->beers as $beer) 
    @foreach($beer->comments as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 

Эта жадная загрузка ограничение будет работать только тогда, когда у вас есть идентификатор пользователя раньше времени.

Представьте, однако, что вы не смогли сдержать нетерпеливую загрузку или запрос, чтобы получить комментарии. Вы можете все еще фильтровать комментарии Коллекция постфактум:

@foreach($user->beers as $beer) 
    @foreach($beer->comments->where('user_id', $user->id) as $comment) 
    {{ $comment }} 
    @endforeach 
@endforeach 
+0

Большое вам спасибо, что я уже выяснял, как добавить предложение where в цикл foreach. Я пробовал делать глупые вещи, как передать параметр отношениям, но в итоге это так же просто, как добавить предложение where.Конечно, я буду придерживаться нетерпеливой загрузки, хотя, спасибо вам, столько за вашу помощь. Застрял на этой проблеме дольше, чем я хотел бы признать ха-ха. –

+0

Я понял, что это еще не совсем то, что я ищу после дальнейших испытаний. Запрос, который вы предоставили, проверяет user_id в таблице комментариев, но мне нужно проверить для user_id таблицу сводных пивных пива. Пользователь user_id из таблицы комментариев просто сообщает, какой пользователь отправил этот комментарий. Мне нужно прокомментировать определенную комбинацию пива_и_, user_id моей сводной таблицы и просто найти пиво_ид, когда я ввожу App \ Beer в качестве commentable_type. Спасибо за вашу помощь. –

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