Как управлять наследованием одной таблицы в Doctrine 2?

У меня есть комментарии и статьи, за обе можно голосовать.

Итак, в основном у меня есть три сущности: Article, Comment и Vote.

После некоторого чтения Наследование одной таблицы в Doctrine2 справочник, кажется, это то, что мне нужно, потому что мой Vote остается неизменным по сравнению с Article или Comment.

Вот как я вижу свою таблицу Vote в представлении ORM:

id | resource_id | resource_type | weight |

Я предполагаю, что resource_type должен быть столбцом «дискриминатора», но я действительно не понимаю, как реализовать это в моей сущности.

Что я пытаюсь сделать, так это избежать необходимости таблицы голосования для каждого из моих объектов, поскольку объект голосования остается одинаковым для обоих, за исключением «resource_type», поэтому я пытаюсь найти способ в Doctrine2 быть возможность работать только с одним Vote объектом.


person JohnT    schedule 28.04.2011    source источник
comment
Я не совсем понимаю, чего вы пытаетесь достичь. Не могли бы вы объяснить немного больше о том, как должен функционировать ваш домен, я думаю, что наследование здесь не подходит...   -  person Cobby    schedule 29.04.2011
comment
@Cobby, я отредактировал свой вопрос, надеюсь, он понятнее   -  person JohnT    schedule 29.04.2011
comment
@Cobby, возможно, ты прав, мне интересно, правильно ли это реализовать такую ​​систему.`   -  person JohnT    schedule 29.04.2011
comment
Я до сих пор не понимаю, когда твоя цель. ИМО, я думаю, у вас должны быть отдельные объекты и отдельные таблицы, даже если они одинаковы. Напишите MappedSuperclass, содержащий всю логику, а затем пустые объекты Vote. Не могли бы вы объяснить вашу систему?   -  person Cobby    schedule 01.05.2011


Ответы (2)


На основе примера из документы:

/**
 * @Entity
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(name="resource_type", type="string")
 * @DiscriminatorMap({"article_vote" = "ArticleVote", "comment_vote" = "CommentVote"})
 */
class Vote
{
    private $id;
    private $weight;
}

class ArticleVote extends Vote
{
    /** @ManyToOne(...) */
    private $article;
}

class CommentVote extends Vote
{
    /** @ManyToOne(...) */
    private $comment;
}
person rojoca    schedule 29.04.2011
comment
Привет, спасибо за ваш пример, я пришел к тому же, но я кое-чего не понимаю, в CommentVote вы добавили свойство $vote, не должно ли это быть $comment, как в ArticleVote? - person JohnT; 29.04.2011
comment
Vote должен быть абстрактным классом или частью карты дискриминатора, чтобы правильно отображаться в иерархии наследования. - person hserge; 15.12.2016

На случай, если кому-то это понадобится, вот подробный пример использования Table Inheritance с Doctrine. Я нашел его более информативным, чем документация Doctrine:

http://blog.liip.ch/archive/2012/03/27/table-inheritance-with-doctrine.html

person David Lin    schedule 03.07.2013