4

私は2つのテーブルを持っています:

comment - id, application_id, comment, user_id, created_at, deleted_at

comment_likes - comment_id, user_id

標準の DQL を使用して、アプリケーションのコメントを取得できますSELECT u FROM Comment WHERE :application = application

コメントをたどるとき、ログインしているユーザーがすでにコメントを気に入っているかどうかを確認したい。

symfony1 では、単純な遅延クエリを使用していたでしょう$comment->hasUserLiked()

現時点では、symfony2 で、アプリケーション コメントに対するすべてのユーザーのいいねのクエリと、すべてのアプリケーション コメントのクエリを実行する必要があります。

アプリケーションのコメントをループするとき、各コメントでサブループを実行して、ユーザーが好きなレコードがユーザーの好きなコメント コレクションに存在するかどうかを確認します。これはきれいではありません。

これが理にかなっていることを願っています。

より良い方法はありますか?

編集:サブコントローラーを使用して、ユーザーがコメントを好むかどうかをレンダリングできます....しかし、それは数行のhtmlだけではかなりやり過ぎのようです。ただし、現在の実装よりもクリーンです。

4

2 に答える 2

2

Commentエンティティとエンティティの間に双方向の一対多の関係を設定する必要がありComment\Likeます。このようにして、Commentエンティティは自分が持っているすべてのいいねについて知ることができます。次に、そのようなメソッドを実装して、$comment->hasBeenLikedBy($user)それが持っているすべての好きなものをループし、渡したユーザーによってそれらのいずれかが行われたかどうかを確認できます。

Commentエンティティ:

<?php
namespace Model;

class Comment 
{
    /**
     * @OneToMany(targetEntity="Model\Comment\Like", mappedBy="comment")
     */
    private $likes;

    public function hasBeenLikedBy(User $user)
    {
        foreach ($this->likes as $like) {
            if ($like->getUser() == $user) {
                return true;
            }

            return false;
        }
    }
}

Comment\Likeエンティティ:

<?php
namespace Model\Comment;

class Like
{
    /**
     * @ManyToOne(targetEntity="Model\Comment")
     */
    private $comment;

    /**
     * @ManyToOne(targetEntity="Model\User")
     */
    private $user

    public function getUser()
    {
        return $this->user;
    }
}

このコードは完全ではなく、誤りを含んでいる可能性がありますが、全体的なアプローチを示すには十分であることを願っています。

于 2012-05-04T16:58:36.893 に答える
0
  1. 呼び出されたときにデータベースにクエリを実行する独自のhasUserLiked()関数を作成できます

  2. コメントといいねのテーブルに参加して、同じ呼び出しでいいねを取得することができます。教義スキーマが正しく設定されている場合は、次のクエリを使用できます。

    SELECT c FROM Comment c LEFT JOIN c.CommentLikes cl WHERE c.application = :application

于 2012-04-29T21:15:24.497 に答える