多对多关系以一种方式运作

时间:2016-04-29 22:44:38

标签: laravel laravel-5 eloquent laravel-5.2

我有UserQuiz型号。我通过以下方式定义了多对多关系:

用户模型

public function subscriptions()
{
    return $this->belongsToMany(Quiz::class, 'subs_users', 'user_id', 'quiz_id')->withTimestamps()->withPivot('accepted');
}

测验模型

public function subscribers()
{
    return $this->belongsToMany(User::class);
}

数据透视表

Schema::create('subs_users', function (Blueprint $table) {
    $table->integer('user_id')->unsigned();
    $table->integer('quiz_id')->unsigned();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('quiz_id')->references('id')->on('quizzes')->onDelete('cascade');

    $table->primary(['user_id', 'quiz_id']);

    $table->boolean('accepted')->index();

    $table->timestamps();
});

当我致电$quiz->subscribers时,它会按预期返回一组用户。但是,$user->subscriptions 始终返回空数组。那是为什么?

修改

似乎在Quiz

中替换了这一行
return $this->belongsToMany(User::class);

return $this->belongsToMany(User::class, 'subs_users', 'quiz_id', 'user_id')->withTimestamps()->withPivot('accepted');

解决了这个问题,但我仍然无法理解为什么第一个变体不起作用。

2 个答案:

答案 0 :(得分:2)

看看这个:

public function subscriptions()
{
    return $this->belongsToMany(Quiz::class, 'subs_users', 'user_id', 'quiz_id')->withTimestamps()->withPivot('accepted');
}

您将外键与其他键混合:user_idquiz_id

请记住,当执行多对多关系时:belongsToMany中声明的第一个外键是与当前模型相关的键。

答案 1 :(得分:0)

使用以下内容替换belongsToMany()模型中的Quiz关系:

return $this->belongsToMany(User::class, 'subs_users');

解决问题。看来,当非标准名称用于数据透视表时,双方必须明确说明。换句话说,'subs_user'数据透视表名称必须出现在两个模型的belongsToMany()关系声明中。