【问题标题】:Many to Many relationship works one way多对多关系以一种方式工作
【发布时间】:2016-04-30 18:19:45
【问题描述】:

我有一个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');

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

【问题讨论】:

  • 能否提供数据库结构
  • @sef4eg 我添加了其他表格

标签: laravel laravel-5 eloquent laravel-5.2


【解决方案1】:

看看这个:

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

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

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

【讨论】:

  • 我已经交换了它们,但没有任何改变
【解决方案2】:

Quiz 模型中的belongsToMany() 关系替换为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2019-06-17
    • 2017-05-23
    相关资源
    最近更新 更多