1

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

表1:

tbl_posts
-id
-name

表 2:

tbl_users
-id
-name

ここで、投稿を見たユーザーの数を数え、キャッシュ数も保持したいと考えています。

私はそのためのテーブルを作成します:(関連付けに適切な名前であるかどうかはわかりません)

tbl_posts_users 
-id
-user_id
-post_id

今私の質問:テーブルを関連付ける適切な方法は何ですか? つまり、ユーザーがいくつかの投稿にアクセスしたときに、tbl_posts_users に挿入し (繰り返し登録せずに)、さらに 2 つのカウントがあります。

ドキュメントでは、begsTo または hasMany を定義する必要がある場合、どのメソッドを使用すればよいかわかりませんでした。

4

1 に答える 1

3

意味のあるテーブル名を使用する

要件に基づいて、たとえば「post_views」(ユーザーによる投稿の表示) などのビューを記録するテーブルに名前を付けることができます。

tbl_post_views
-id
-user_id
-post_id

接頭辞でない場合tbl_は、従来のように削除してください。

したがって、post と user の両方に属する PostView という名前のモデルがあります。

class PostView extends AppModel {

    public $belongsTo = array('Post', 'User');

}

ビュー アクションを使用してビューを追跡しないでください

ほとんどの場合、現在の意図は次のようなものを実装することです:

class PostsController extends AppController {

    public $uses = array('Post', 'PostView');

    public function view($id) {
        $this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
        $data = $this->Post->findById($id);
        $this->set(compact('data'));

    }
}

そうしないほうがいいです。ビューをコントローラ コードに記録することには、2 つの重大な問題があります。

  1. ユーザーがそれを見るのではなく、ビューを生成することを記録しています(必ずしも同じものではありません)
  2. キャッシュに干渉します(phpまたはユーザーのブラウザのいずれかで)

画像ビーコンを使用する

リクエストが行われたときにビューを記録する代わりに、レンダリングされた出力に「イメージ ビーコン」を含めます。

// end of file View/Posts/view.ctp
echo $this->Html->image(array('action' => 'viewed', $postId), array('class' => 'beacon'));

投稿コントローラーで、投稿が閲覧されたことを記録し、適切なヘッダーを使用して有効な画像を出力します (そうしないと、ユーザーのブラウザーによってエラーが報告されます)。これにより、応答がキャッシュされなくなります。

class PostsController extends AppController {

    ...

    public function viewed($id) {
        $this->PostView->save(array('user_id' => $this->Auth->user('id'), 'post_id' => $id));
        $this->response->disableCache();
        $this->response->file('webroot/img/1px.gif'); // a 1px gif
        return $this->response;
    }
}

このように、ユーザーがどのような方法でコンテンツを読んだかに関係なく、ユーザーが該当するページを閲覧したという記録が残ります。

于 2013-10-07T17:13:21.330 に答える