Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 07.07.2017 08:50:00

Множественное отношение

Добрый день.
Laravel стал изучать недавно и появились вопросы по отношениям.

Да пустим есть 3 модели с табличками:

post
id
name
....


comment
id
text
user_id
post_id
....


user
id
login
...

Как в отношениях мне определить в каких постах пользователь оставил комментарий?

Не в сети

#2 07.07.2017 08:56:02

Re: Множественное отношение

полагаю hasManyThrough с App\User на App\Post через App\Comment

самому никогда не приходилось пользоваться, но по-моему оно как раз для этого и предназначено…

Не в сети

#3 07.07.2017 09:39:12

Re: Множественное отношение

А можно что то типа такого:

class Post extends Model
{
  public function comment()
  {
    return $this->hasMany('App\Comment');
  }
}

class Comment extends Model
{
  public function user()
  {
    return $this->belongsToMany('App\User');
  }
}

class UserController extended Controller
{
  public function getIndex(){
   $user = App\User::find(1);
   //Можно как то так определить?
   $user->coment->post
  }
}

Не в сети

#4 07.07.2017 09:50:52

Re: Множественное отношение

Не в сети

#5 07.07.2017 09:59:09

Re: Множественное отношение

Перед тем, как начать определять в каких постах пользователь оставил комментарий, определись какие отношения ты хочешь использовать здесь. По идее, здесь напрашивается отношение многие ко многим, в таком случае comments - это pivot таблица.

В таком случае тебе нужно добавить withPivot('text') в отношение, чтобы загружались дополнительные поля.

Если используешь многие ко многим, назови связь "userComments", например. Получить посты, в которых пользователь (в данном примере текущий авторизованный) оставил комментарии можно так:

$posts = Post::whereHas('userComments', function ($q) {
    $q->where('id', auth()->id());
})->get();

Если ты используешь здесь hasMany, т.е. user hasMany posts и post hasMany users, тогда выдергивай посты так:

$posts = Post::whereHas('userComments', function ($q) {
    $q->where('user_id', auth()->id());
})->get();

Изменено AlexeyMezenin (07.07.2017 10:01:40)

Не в сети

#6 07.07.2017 11:51:41

Re: Множественное отношение

crash, ещё раз – задай отношение hasManyThrough и не изобретай то что уже изобретено, тебе Владислав уже даже ссылку на доку дал…

Не в сети

#7 07.07.2017 11:59:59

Re: Множественное отношение

hasManyThrough подойдет только если User здесь - это автор поста и плевать какие пользователи оставляли комментарии. Когда User это автор коммента, здесь будет работать belongsToMany (многие ко многим), либо hasMany (один ко многим). Я бы сделал по уму - многие ко многим. В специфичных случаях можно использовать hasMany.

Не в сети

#8 07.07.2017 13:00:34

Re: Множественное отношение

hasManyThrough подойдет только если User здесь - это автор поста и плевать какие пользователи оставляли комментарии. Когда User это автор коммента, здесь будет работать belongsToMany (многие ко многим), либо hasMany (один ко многим). Я бы сделал по уму - многие ко многим. В специфичных случаях можно использовать hasMany.

почему, как раз если на комменты и на посты авторство – это hasMany. отношение к постам через авторство на комменты – это hasManyThrough. а belongsToMany это вообще многие-ко-многим – можно конечно заводить отдельную таблицу и там отмечать кто в комментах к какому посту отметился, но это получится уже как бы кэш для тех данных, которые уже есть в базе – причём при удалении коммента, надо руками отдельно проверять а есть ли у этого автора ещё комменты в посте и надо ли убирать запись из этой дополнительной таблички или пока не надо… в общем надо смотреть по логике работы приложения, может оказаться что эту связь пользователя с откомменченными постами вообще никогда не надо снимать…

Не в сети

#9 07.07.2017 13:11:11

Re: Множественное отношение

hasManyThrough для User > Post > Comments вернет все комменты, которые есть в постах данного пользователя (постах, где пользователь - автор).

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

Зачем отдельная таблица? comments - это уже по сути pivot таблица с дополнительным полями.

Не в сети

#10 07.07.2017 13:32:50

Re: Множественное отношение

hasManyThrough для User > Post > Comments

я имел в виду hasManyThrough для User > Comment > Posts конечно же

Не в сети

#11 07.07.2017 14:28:29

Re: Множественное отношение

я имел в виду hasManyThrough для User > Comment > Posts конечно же

Нет, hasManyThrough для User > Comment > Posts не будет работать вообще, потому что Comment belongsTo Post.

Не в сети

Подвал раздела