Сложные комментарии, теги, голоса, отношения с базой данных избранного с помощью Laravel

Я пытаюсь изучить HABTM и Полиморфные отношения, создав небольшое, но сложное приложение в Laravel 4.2. Он принимает ссылки и позволяет пользователям взаимодействовать с контентом и друг с другом с помощью ключевых слов, таких как тег, комментарий, голосование, избранное и подписка. Я честно работал над этим в течение приблизительно 3 дней и чувствую, что я просто вращаю свои колеса в грязи. Вот разбивка —

Модели:

User, Link, Tag, Comment, Vote, Favorite, Follow

Супер базовые варианты использования:

USER -> ACTION   -> TARGET
User -> Submit   -> Link, Tag, Comment
User -> Tag      -> User, Link
User -> Comment  -> User, Link
User -> Vote     -> Tag, Comment
User -> Favorite -> User, Link, Tag, Comment
User -> Follow   -> User, Tag

(предполагается) Таблицы:

users            [id, username]
links            [id, user_id, url]
tags             [id, user_id, text]
commentables     [id, user_id, commentable, commentable_id, text] //how do i handle comment replies?
taggables        [id, user_id, taggable, taggable_id, weight]
votables         [id, user_id, voteable, voteable_od, vote]
favorables       [id, user_id, favorable, favorable_id]
followable       [id, user_id, followable, followable_id]

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

Как выглядят мои файлы моделей? Какие случаи я мог бы использовать, принадлежат ToMany против morphToMany? Это даже правильный подход, или я должен исследовать, используя сводные таблицы? Я был бы признателен за некоторые советы о том, что мне нужно учиться, чтобы реализовать это правильно

Вот как будет выглядеть мой User.php, но я не уверен, каким должен быть результат на самом деле, так как я не совсем понимаю желания / потребности отношений

(предполагается) User.php

usersFavored()    // Users which this User has Favored
usersFollowed()   // Users which this User has Followed
linksSubmitted()  // Links created by the User in the DB
linksFavored()    // ...
tagsOnSelf()      // Tags attached to this User by other Users
tagsCreated()     // Tags which the User created in the DB
tags()            // Tags which the User was the first to attach to a Link
tagsVoted()       // Tags on which the User has Voted across the entire site
tagsFavored()     // ...
tagsFollowed()    // ...
commentsOnSelf()  // ...
comments()        // Comments across the site
commentsFavored() // ...
votesOnSelf()     // ...
votes()           // Votes across the site
favorites()       // Favorites across the site
follows()         // Follows across the site

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

0

Решение

вот некоторые из моих мыслей

  1. Я был действительно смущен о том, использовать ли принадлежит ToMany против morphToMany. Но теперь, когда я знакомлюсь с Laravel, мне становится ясно, что то, что может сделать morphToMany, может также делать принадлежащий ToMany. Так что вам нужен только мастер принадлежит ToMany. Это достаточно мощный. Однако, если вы хотите узнать разницу между этими двумя отношениями, вот объяснение того, когда вы должны использовать любое из них. Для ownToMany вы просто хотите получить некоторые объекты, и вас не волнует их состояние. Однако, если вам необходимо различать состояния между этими объектами, например голоса (два типа: голосование вверх и голосование вниз), вы можете использовать morphToMany.
  2. Для вашего предполагаемого User.php каждая из этих функций должна просто возвращать экземпляр SQL-запроса. Эти функции используются в контроллере для получения результатов. Проще говоря, функции в моделях — это просто разные SQL-операторы, хорошо упакованные для использования в контроллерах. Таким образом вы отделяете бизнес-логику от операторов выбора SQL.
  3. Когда вы вызываете функции в моделях, убедитесь, что вы вызываете -> get (), чтобы обеспечить выполнение оператора sql. По сути, каждая функция в моделях только возвращает неисполненный оператор SQL. Если вы хотите получить результаты операторов SQL, вам нужно вызвать -> get ().

Надеюсь это поможет. Готов помочь, если у вас есть еще вопросы

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]