2016-03-24 5 views
-1

私は3つのDBテーブルを持っています:プロジェクト、投票、ジャンクションテーブルproject_votes。各プロジェクトには多くの投票権があります。着信メッセージを区別するために、Votesテーブルのステータス列を使用することをお勧めします(可能な値「new」および「old」)。私のアプリでは、ユーザーが自分のプロジェクトを開くと、新しいメッセージはすべて古いものになるはずです。私は、次のコードでこれを行う:Yii2。新しいメッセージを管理するベストプラクティスは何ですか?

public function getNewVotes() 
    { 
     return $this->hasMany(Vote::className(), ['id' => 'vote_id'])->where(['like', 'status', 'new'])->via('projVotes'); 
    } 

は古いように、すべての票を設定します:

$model->newVotes = 'old'// in Controller 

public function setNewVotes($var)// in Model 
    { 
    foreach ($this->newVotes as $value) { 
      $value->status = $var; 
      $value->update();   
      } 
    } 

するか、foreachループのない良い方法はあり は、新たな票を取得します。たとえば、where句でupdateを使用していますか?

答えて

1

私はユーザーがプロジェクトに投票できると仮定します。もしそうなら、接合テーブルを投票してみてください。

  • プロジェクト(id名・ファンド)
  • 票(IDのPROJECT_IDのUSER_ID値)//値が投票を表現 する手段であること
  • ユーザー

そうでない場合は、なぜ(ID名)ジャンクション・テーブルを追加するのではなく、投票で外部キーを作成しないでください。あなたの質問については

  • プロジェクト(id名・ファンド)
  • 票(IDのPROJECT_ID値)

、私はブールフィールドを追加したデフォルトはfalse投票表に '読み取り'。

プロジェクトの未読票を取得するには、これをプロジェクトモデルに追加します。

public function getUnreadVotes() 
{ 
    return Vote::find()->where([ 
     'project_id' => $this->id, 
     'read' => false 
    ])->all(); 
} 

これらをフェッチした後に投票を設定するには、updateAll()を使用できます。

Vote::updateAll(['read' => true], ['project_id' => $this->id]); 
+0

ありがとうございます。それは有用な情報です。 – Dmytro

+0

問題はありません。喜んで助けになるでしょう。 – ttdijkstra

関連する問題