2017-02-09 14 views
0

私は投票しました。投票にはオプションがあり、オプションには投票があります。他の列のLaravel同期

誰かが私はこのようなDBに格納それだ投票する場合:

public function store(Option $option) 
{ 
    $option->votes()->sync([Auth::user()->id]); 
} 

ピボットテーブルは次のようになります。

id 
option_id 
user_id 

は、どのように私は、ユーザーがすでに投票したときにことを確認してください他の投票がなくなると何かのために投票しますか?

シンクメソッドはIDのみを探します。ここで

+0

あなたが呼び出したときの同期方法は、必要なものを正確に行います。 'user_id == Auth :: user() - > id'と' option_id == $ option-> id'を持つピボットテーブルの列を探します。だからそれはうまくいくはずです。 – devk

+0

@devkあなたは正しいです!おかげさまで、ごめんなさい。しかし、ユーザーが投票に一度しか投票できないことをどうやって確認することができますか? – Jamie

+0

あなたのデータベースがどのように設定されているのかよく分かりません(私はオプションが何らかの形でポーリングに属していると考えています。 1つの方法は、投票とユーザーの間にピボットを設けることです。ピボットが存在する場合、ユーザーが投票できない場合、ユーザーは投票に投票しました(これ以上キャンしません)。しかし、あなたのデザインによっては、より良いオプションがあるかもしれません。 – devk

答えて

2

は、私がどうなるかです:

データベース:

Poll 
- name 

Option 
- value 
- poll_id 

Vote 
- poll_id 
- option_id 
- user_id 

関係:

class Poll extends Model 
{ 
    public function options() 
    { 
     return $this->hasMany(Option::class); 
    } 

    public function votes() 
    { 
     return $this->hasMany(Vote::class); 
    } 
} 

class Option extends Model 
{ 
    public function poll() 
    { 
     return $this->belongsTo(Poll::class); 
    } 
} 

class Vote extends Model 
{ 
    public function poll() 
    { 
     return $this->belongsTo(Poll::class); 
    } 

    public function option() 
    { 
     return $this->belongsTo(Option::class); 
    } 

    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 
} 

class User extends Model 
{ 
    public function votes() 
    { 
     return $this->hasMany(Vote::class); 
    } 
} 

ユーザーが複数のオプションのために投票することができますことを回避するためのコード:

// We first remove any eventually vote from this user on this poll 
$user->votes()->where('poll_id',$poll->id)->delete(); 

// We then create a vote for the user 
$user->votes()->create([ 
    'poll_id' => $poll->id, 
    'option_id' => $option->id 
]); 

これはより柔軟に対応できます。たとえば、このコードでは、特定のユーザーのすべての投票を一覧表示する投票を通じてユーザーと投票者の間にhasManyThroughの関係を作成できます。

+1

お時間をありがとう!私は今poll_idを追加していないピボットテーブルを持っていました。そして、それはもっとクリーンな感謝です! – Jamie

関連する問題