2017-02-09 49 views
0

我已經進行了投票。民意調查有選項,選項有選票。Laravel在其他列上同步

當有人票我把它存儲在數據庫這樣的:

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

我不知道你的數據庫是如何建立的(我假設選項屬於民意調查以某種方式,不知道是否通過多對多或一對多)。一種方法是在民意調查和用戶之間建立一個關鍵點。如果數據透視表存在,用戶就投票投票(不能再投票),如果用戶沒有投票權。但取決於你的設計,你可能有更好的選擇 – 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 
]); 

This會讓你更靈活。例如,通過此代碼,您可以通過投票來創建hasManyThrough用戶和投票之間的關係,以列出某個用戶的所有投票。

+1

感謝您的時間!我有一個數據透視表,現在沒有添加poll_id。謝謝你! – Jamie