Laravel:一对多关系中的自定义外键无法解决

有两个模型UserSubmission,一个 User 可以有任意数量的提交,其中他被引用为Author我已经根据文档建立了关系,结果hasMany()工作正常。只是该belongsTo()方法没有返回预期的对象。

这是我的模型的迁移:

Schema::create('users', function (Blueprint $table) {

    $table->id();

});


Schema::create('submissions', function (Blueprint $table) {

    $table->id();

    $table->foreignId( 'author' );

    $table->foreign( 'author' )->references('id')->on('users');

});

这些是我的模型中的关系:


class User extends Authenticatable {

    public function submissions() {

        return $this->hasMany( 'App\Submission', 'author' );

    }

}


class Submission extends Model {

    public function author() {

        return $this->belongsTo( 'App\User', 'author' );

    }

}

现在,在我的控制器中我想执行以下代码:


$author = Submission::find(1)->author;

dd($author);

但是,打印的是存储的作者 ID 的整数值,而不是用户对象。这种关系似乎并没有通过该author()方法解决。另一方面,当我获取用户及其提交内容时,一切都按预期进行,即提交内容被打印为对象:


$u = User::find(1)->submissions;

dd($u);

但是,当我没有定义自定义外键并将列重命名为时,从提交到用户的关系确实得到了正确解决。belongsToauthor_id


有效的配置是这样的:


//migration for Submissions table

Schema::create('submissions', function (Blueprint $table) {

    $table->id();

    $table->foreignId( 'author_id' );

    $table->foreign( 'author_id' )->references('id')->on('users');

});


//within Submission model

public function author() {

    return $this->belongsTo( 'App\User' );

}

我有一种感觉,我错过了一些东西。我还需要建立任何额外的链接吗?我浏览了文档和网络来寻找解决方案,但没有成功。如果没有其他解决方案,我将重命名该列。但我宁愿了解问题的原因并使用我的原始设计。


炎炎设计
浏览 92回答 1
1回答

慕森卡

您不应使用相同的字符串来命名关系函数和字段。当你有一个专栏author并且public function author()Laravel 首先会获取专栏内容。将 '_id' 添加到列中,这样您就不需要在$this->belongsTo( 'App\User', 'author' );.
打开App,查看更多内容
随时随地看视频慕课网APP