は、私がどうなるかです:
データベース:
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
の関係を作成できます。
あなたが呼び出したときの同期方法は、必要なものを正確に行います。 'user_id == Auth :: user() - > id'と' option_id == $ option-> id'を持つピボットテーブルの列を探します。だからそれはうまくいくはずです。 – devk
@devkあなたは正しいです!おかげさまで、ごめんなさい。しかし、ユーザーが投票に一度しか投票できないことをどうやって確認することができますか? – Jamie
あなたのデータベースがどのように設定されているのかよく分かりません(私はオプションが何らかの形でポーリングに属していると考えています。 1つの方法は、投票とユーザーの間にピボットを設けることです。ピボットが存在する場合、ユーザーが投票できない場合、ユーザーは投票に投票しました(これ以上キャンしません)。しかし、あなたのデザインによっては、より良いオプションがあるかもしれません。 – devk