2017-02-21 7 views
0

У меня есть система комментариев, как показано ниже. Пользователь может комментировать статьи, изображения и сообщения. Все работает нормально. Но в дополнение к этому я хочу добавить раздел, где пользователь может прокомментировать сам сайт, что-то вроде общего комментария. Я хочу интегрировать это в существующую систему комментариев. Но, естественно, нет таблицы или модели для самого сайта, где я мог бы добавить отношения. Что было бы хорошим путем?Как добавить/интегрировать общий комментарий к существующей системе комментариев в laravel?

таблицы как:

articles 
    id - integer 
    title - string 
    body - text 

posts 
    id - integer 
    title - string 
    body - text 

images 
    id - integer 
    title - integer 
    path - text 

comments 
    id - integer 
    comment - text 
    commentable - integer 
    commentable_type - string 

и модель что-то вроде:

class Post extends Model 
{ 
    public function comments() 
    { 
     return $this->morphMany(Comment::class, 'commentable'); 
    } 
} 

class Images extends Model 
{ 
    public function comments() 
    { 
     return $this->morphMany(Comment::class, 'commentable'); 
    } 
} 

class Article extends Model 
{ 
    public function comments() 
    { 
     return $this->morphMany(Comment::class, 'commentable'); 
    } 
} 

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

Если у вас есть таблица 'users', то, возможно, настало время добавить отношение комментариев к модели' User'? я тоже являюсь частью комментариев. Просто думая о путях ... –

ответ

1

Поскольку у вас есть только один сайт, вы можете установить свои поля морфинга быть обнуляемыми и добавить объем к вашим Comment модель, которая вернет только те комментарии, которые связаны с вашим сайтом, например:

public function scopeForWebsite($query) { 
    return $query->where(function($query) { 
     $query->whereNull('commentable')->whereNull('commentable_type'); 
    }); 
} 

, а затем получить ваши комментарии веб-сайт с помощью:

Comment::forWebsite()->get()

При создании комментария просто не прикрепить его к любой организации, и он будет рассматриваться как глобальный, общий один.

Просто помните, что вам необходимо вручную добавить поля commentable и commentable_type в свою миграцию (вместо предполагаемого $table->morphs('commentable')), пометить их как NULL и проиндексировать эти поля.

+0

вы совершенно правы. Я определенно буду использовать это. Но зачем «индексировать эти поля»? Вы сказали, что для (родового) ускорения стола или по другой причине? – Skeletor

+1

Laravel автоматически индексирует поля морфинга при вызове '$ table-> morphs (...);', но если вы добавляете их вручную, вам нужно добавить индекс самостоятельно. Если вы этого не сделаете, вы будете испытывать проблемы с производительностью при использовании активной загрузки (например, «Article :: with (« comments ») -> all()') – Mariusz