Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день.
Laravel стал изучать недавно и появились вопросы по отношениям.
Да пустим есть 3 модели с табличками:
post
id
name
....comment
id
text
user_id
post_id
....user
id
login
...
Как в отношениях мне определить в каких постах пользователь оставил комментарий?
Не в сети
полагаю hasManyThrough с App\User на App\Post через App\Comment
самому никогда не приходилось пользоваться, но по-моему оно как раз для этого и предназначено…
Не в сети
А можно что то типа такого:
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
}
}
Не в сети
Не в сети
Перед тем, как начать определять в каких постах пользователь оставил комментарий, определись какие отношения ты хочешь использовать здесь. По идее, здесь напрашивается отношение многие ко многим, в таком случае 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)
Не в сети
crash, ещё раз – задай отношение hasManyThrough и не изобретай то что уже изобретено, тебе Владислав уже даже ссылку на доку дал…
Не в сети
hasManyThrough подойдет только если User здесь - это автор поста и плевать какие пользователи оставляли комментарии. Когда User это автор коммента, здесь будет работать belongsToMany (многие ко многим), либо hasMany (один ко многим). Я бы сделал по уму - многие ко многим. В специфичных случаях можно использовать hasMany.
Не в сети
hasManyThrough подойдет только если User здесь - это автор поста и плевать какие пользователи оставляли комментарии. Когда User это автор коммента, здесь будет работать belongsToMany (многие ко многим), либо hasMany (один ко многим). Я бы сделал по уму - многие ко многим. В специфичных случаях можно использовать hasMany.
почему, как раз если на комменты и на посты авторство – это hasMany. отношение к постам через авторство на комменты – это hasManyThrough. а belongsToMany это вообще многие-ко-многим – можно конечно заводить отдельную таблицу и там отмечать кто в комментах к какому посту отметился, но это получится уже как бы кэш для тех данных, которые уже есть в базе – причём при удалении коммента, надо руками отдельно проверять а есть ли у этого автора ещё комменты в посте и надо ли убирать запись из этой дополнительной таблички или пока не надо… в общем надо смотреть по логике работы приложения, может оказаться что эту связь пользователя с откомменченными постами вообще никогда не надо снимать…
Не в сети
hasManyThrough для User > Post > Comments вернет все комменты, которые есть в постах данного пользователя (постах, где пользователь - автор).
можно конечно заводить отдельную таблицу и там отмечать кто в комментах к какому посту отметился, но это получится уже как бы кэш для тех данных, которые уже есть в базе – причём при удалении коммента, надо руками отдельно проверять а есть ли у этого автора ещё комменты в посте и надо ли убирать запись из этой дополнительной таблички или пока не надо
Зачем отдельная таблица? comments - это уже по сути pivot таблица с дополнительным полями.
Не в сети
hasManyThrough для User > Post > Comments
я имел в виду hasManyThrough для User > Comment > Posts конечно же
Не в сети
я имел в виду hasManyThrough для User > Comment > Posts конечно же
Нет, hasManyThrough для User > Comment > Posts не будет работать вообще, потому что Comment belongsTo Post.
Не в сети
Страницы 1