這裏是我會怎麼做:
數據庫:
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
用戶和投票之間的關係,以列出某個用戶的所有投票。
您調用它的同步方法將完全按照您的需要進行操作。它將查找具有'user_id == Auth :: user() - > id'和'option_id == $ option-> id'的數據透視表列。所以它應該沒問題。 – devk
@devk你是對的!感謝有點抱歉。但任何想法我怎麼能確保用戶只能投票一次投票? – Jamie
我不知道你的數據庫是如何建立的(我假設選項屬於民意調查以某種方式,不知道是否通過多對多或一對多)。一種方法是在民意調查和用戶之間建立一個關鍵點。如果數據透視表存在,用戶就投票投票(不能再投票),如果用戶沒有投票權。但取決於你的設計,你可能有更好的選擇 – devk