2015-12-10 3 views
0

У меня есть 3 таблицы базы данных.Является ли это правильной моделью Laravel 5?

users 
    id - integer 
    username - string 

post 
    id - integer 
    user_id - integer 
    topic - string 

comments 
    id - integer 
    user_id - integer 
    post_id - integer 

Что я делаю в зрении я цикл через все посты, которые пользователь создал, делая что-то вроде

Post::where('user_id', Auth::user()->id)->get(); 

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

Модель пользователя:

class User extends Model { 

public function post() 
{ 
    return $this->hasMany('App\Post') 
} 

public function comment() 
{ 
    return $this->hasMany('App\Comment', 'user_id') 
} 

} 

Сообщение Модель:

class Post extends Model { 

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

public function comment() 
{ 
    return $this->hasMany('App\Comment') 
} 

// I thought this method below would return the users who had commented on the post 

public function commenters() 
{ 
    return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'username'); 
} 

} 

Комментарий Модель:

class Comment extends Model { 

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

public function post() 
{ 
    return $this->belongsTo('App\Post') 
} 

} 

Таким образом, конечный результат должен быть что-то вроде этого им угадывать?

Вид:

<span>{{ $model->modelmethod->count() }}</span> 

Мои ребята мнения здесь? Правильно ли это? Или есть что-то другое, что вы рекомендуете?

ответ

0

Чтобы решить первую проблему, Что я делаю в зрении я цикл через все посты, которые пользователь создал, делая что-то вроде вы можете использовать Eager Loading - однако, это потребует от вас, чтобы получить доступ вложенности элемент (ы). Этот запрос извлечение пользователя и все его пост, включая комментаторов:

$user = User::with('post.commenters')->where('id', $userId)->firstOrFail(); 

Таким образом, вы будете иметь возможность получить доступ к массиву сообщений пользователя с $user->post. Тогда доступ к его комментаторам, можно указать индекс массива (или использовать foreach loop) домен .ru:

//this is array access, accessing first post 
$user->post[0]; 
//this iterate all post using foreach 
foreach($user->post as $posts){ 
    $post-> //do something with current post? 
} 

Что касается второго проблемы, считая, что можно сделать в запросе к базе данных - или в представлении (я часто сделайте это, поскольку это довольно простой, читаемый и, менее запрос).

//this prints all posts number of commenters - in blade 
@foreach($user->post as $posts) 
    @foreach($posts->commenter as $commenter) 
    {{ count($commenter) }} 
    @endforeach 
@endforeach 

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

return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'username'); 

должно быть

return $this->hasManyThrough('App\User', 'App\Comment', 'user_id', 'id'); 

как вы на самом деле используйте user_id вместо своего имени пользователя в качестве внешнего ключа в комментариях.

+0

Привет, Тезла, я ищу, чтобы подсчитать количество пользователей, которые прокомментировали. Не количество комментариев. –

+0

ah mybad, вы можете получить пользователя через загруженную загрузку - я отредактирую свой ответ. –

+0

ключ был связан с ':: with (relationship)', если вы хотите получить посткоммерческий комментатор, глядя на ваше отношение к модели - это может быть сделано через это, однако, что не будет получать фактический комментарий. –

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