2017-02-09 11 views
0

Я сделал опрос. У опроса есть варианты, и у опции есть голоса.Laravel sync на другом столбце

Когда кто-то голосует я хранить его в БД, как это:

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

Сводная таблица выглядит следующим образом:

id 
option_id 
user_id 

Как я могу убедиться, что, когда пользователь уже проголосовал , а затем голосует за что-то другое, другой голос уходит?

Метод синхронизации ищет только идентификатор.

+0

Метод синхронизации, который вы назвали, будет делать именно то, что вам нужно. Он будет искать столбцы сводной таблицы, которые имеют 'user_id == Auth :: user() -> id' AND' 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 
]); 

Этот позволит вам проявить большую гибкость. Вы можете, например, с помощью этого кода создать связь hasManyThrough между пользователем и опросом путем голосования, чтобы перечислить все опросы определенного пользователя.

+1

Спасибо за ваше время! У меня была сводная таблица без добавления poll_id. И это намного более чистое спасибо! – Jamie