Laravel 在其他列上同步

Posted

技术标签:

【中文标题】Laravel 在其他列上同步【英文标题】:Laravel sync on other column 【发布时间】:2017-02-09 12:09:16 【问题描述】:

我进行了一项民意调查。投票有选项,选项有投票。

当有人投票时,我会将其存储在数据库中,如下所示:

public function store(Option $option)

    $option->votes()->sync([Auth::user()->id]);

数据透视表如下所示:

id
option_id
user_id

我如何确保当一个用户已经投票,然后投票给其他东西时,另一个投票消失了?

同步方法只是寻找 id。

【问题讨论】:

您调用的同步方法将完全满足您的需求。它将查找具有user_id == Auth::user()->idoption_id == $option->id 的数据透视表列。所以应该没问题。 @devk 你是对的!谢谢有点困惑抱歉。但是知道如何确保用户只能为投票投票一次吗? 我不确定您的数据库是如何设置的(我假设选项以某种方式属于轮询,不确定是多对多还是一对多)。一种方法是在民意调查和用户之间建立一个枢纽。如果枢轴存在,则用户在投票中投票(不能再),如果不存在,则用户可以投票。但根据您的设计,您可能有更好的选择 我不确定同步功能是否足以满足他想做的事情 【参考方案1】:

我会这样做:

数据库:

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 关系,通过投票列出某个用户的所有投票

【讨论】:

感谢您的宝贵时间!我现在有一个没有添加 poll_id 的数据透视表。而且它更清洁谢谢!

以上是关于Laravel 在其他列上同步的主要内容,如果未能解决你的问题,请参考以下文章

模式构建器 laravel 迁移在两列上是唯一的

laravel 我需要在 unique() 列上使用 index() 吗?

Laravel 在 2 列上搜索特定的包含单词

使用 Laravel 在 json 列上创建索引

如何在laravel 5中的关系列上使用“有”和分页

laravel 5.2中一列上有2个外键