【问题标题】:M:N relationships on Laravel 4Laravel 4 上的 M:N 关系
【发布时间】:2014-08-30 08:52:26
【问题描述】:

我有一个在 Laravel 4 中完成的 web 应用程序,用户可以在其中创建和投票投票。这是迁移(简化):

民意调查迁移:

public function up() {
    Schema::create('polls', function(Blueprint $table) {
        $table->increments('id');
        $table->string('topic');
        $table->timestamps();
    });
}

用户迁移:

public function up() {
    Schema::create('users', function(Blueprint $table) {
        $table->increments('id');
        $table->string('email');
        $table->string('password');
        $table->timestamps();
    });
}

现在:

我想在用户对投票进行投票时记录下来(这样他们就不能再次投票了)。

我想我应该做一些 M:N 表。有点像这样:

| User ID | Poll ID   |
|---------|-----------|
|       1 |         5 |
|       1 |         7 |
|       1 |         8 |
|       3 |         5 |
|     ... |       ... |

但是 Laravel 使用 Eloquent ORM,我读过有像 belongsToManyhasMany 这样的函数。所以,我想知道:

是否有任何约定或“聪明”的方式来设置这种“关系表”以简化开发和维护?

【问题讨论】:

    标签: php laravel orm laravel-4 relational-database


    【解决方案1】:

    是的,您需要 3 个表才能使多对多关系正常工作。 belongsToMany 的函数只是在告诉 eloquent 如何获取数据。

    如果您使用jeffrey way's laravel generator 包,您可以简单地使用以下命令来创建链接表。

    php artisan generate:pivot polls users
    

    然后在您的模型中相应添加

    // poll model
    public function users()
    {
        return $this->belongsToMany('User');
    }
    
    // user model
    public function poll()
    {
        return $this->belongsToMany('Poll');
    }
    

    【讨论】:

    • 这太糟糕了:) 有没有办法自动填充 M:N 表?还是我必须手动完成?
    • 我会用seeds 来做这件事,然后根据你的喜好添加它们(例如$poll->users()->saveMany($users) 等。有多种可能性)
    • 我认为播种是为数据库提供初始值。我不确定它与这个问题有什么关系。
    • 另外,我如何在用户投票的地方添加投票,而不删除我已经注册的投票?我将如何“删除”某个民意调查中的用户记录,而不将它们全部删除?
    • 对于从枢轴中删除单个条目的具体操作,您可以使用$poll->users()->detach($user_id)
    猜你喜欢
    • 2011-08-24
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多