我有User
和Quiz
型号。我通过以下方式定义了多对多关系:
用户模型
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');
解决了这个问题,但我仍然无法理解为什么第一个变体不起作用。
答案 0 :(得分:2)
看看这个:
public function subscriptions()
{
return $this->belongsToMany(Quiz::class, 'subs_users', 'user_id', 'quiz_id')->withTimestamps()->withPivot('accepted');
}
您将外键与其他键混合:user_id
和quiz_id
。
请记住,当执行多对多关系时:belongsToMany
中声明的第一个外键是与当前模型相关的键。
答案 1 :(得分:0)
使用以下内容替换belongsToMany()
模型中的Quiz
关系:
return $this->belongsToMany(User::class, 'subs_users');
解决问题。看来,当非标准名称用于数据透视表时,双方必须明确说明。换句话说,'subs_user'
数据透视表名称必须出现在两个模型的belongsToMany()
关系声明中。