4

Q&Aサイトを構築していますが、質問、回答、コメントは同じpostsテーブルにあります。しかし、それらpostTypeは異なります。この関連付けを使用すると、質問に対する回答と回答に対するコメントを取得できます。

/**
 * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent")
 */
private $answers;

/**
 * @OneToMany(targetEntity="Cms\Entity\Post", mappedBy="parent")
 */
private $comments;

しかし、これは正しい方法ではないと思います。質問を取得すると、回答とコメントの両方が回答だけで埋められるためです。私は次のような関係の条件を設定する必要がありますpostType = 1

これどうやってするの?

4

2 に答える 2

10

スキーマが無効です。共通のインターフェースを共有していても、回答とコメントは 2 つの異なるオブジェクトであるため、2 つの異なるオブジェクトを使用する必要があります。

2 つのエンティティAnswerComment作成し、それらへの関連付けを作成する必要があります。AbstractContentこれらはほぼ同じものであるため、必要なすべてのフィールドとアクセサ メソッドを定義する抽象クラス を作成できます。Doctrine は継承をサポートしているため、最終的なデータベース スキーマはまったく同じになりますが、オブジェクト指向モデルは正しくなります。

/** 
 * @MappedSuperclass 
 * @InheritanceType("SINGLE_TABLE")
 * @DiscriminatorColumn(type = "string", name = "discriminator")
 * @DiscriminatorMap({ "answer" = "Answer", "comment" = "Comment" })
 */
abstract class AbstractContent {
    /** @Column(type = "integer") @Id @GeneratedValue("AUTO") */
    protected $id;

    /** @Column(type="text") */
    protected $content;

    /** @Column(type = "datetime", name = "created_at") */
    protected $createdAt;

    public function __construct() {
        $this->createdAt = new \DateTime();
    }
}

/** @Entity */
class Answer extends AbstractContent { }

/** @Entity */
class Comment extends AbstractContent { }

/**
 * @OneToMany(targetEntity="Cms\Entity\Answer", mappedBy="parent")
 */
private $answers;

/**
 * @OneToMany(targetEntity="Cms\Entity\Comment", mappedBy="parent")
 */
private $comments;

Doctrine の継承の詳細については、Doctrine のドキュメント ページを参照してください: Inheritance Mapping

于 2011-07-09T11:24:48.600 に答える
4

Doctrine のFiltering Collections Criteria classを使用します。SQLクエリの前に最初にコレクションをフィルタリングすることもできます:

コレクションがまだデータベースからロードされていない場合、フィルタリング API は SQL レベルで動作し、大規模なコレクションへの最適化されたアクセスを行うことができます。

use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Collections\Criteria;

...

    /** @var Collection */
    protected $posts;

    /**
     * @return Post[]
     */
    public function getAnswers()
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq('postType', 'answer'))
        ;

        return $this->posts->matching($criteria);
    }

    /**
     * @return Post[]
     */
    public function getComments()
    {
        $criteria = Criteria::create()
            ->where(Criteria::expr()->eq('postType', 'comment'))
        ;

        return $this->posts->matching($criteria);
    }
于 2014-11-26T17:04:15.000 に答える