【问题标题】:Having an extra attribute (not pivot) in a manytomany relationship with Laravel在与 Laravel 的多对多关系中具有额外的属性(不是枢轴)
【发布时间】:2018-04-10 04:18:58
【问题描述】:

TL;DR

使用 Laravel 5.6,我需要在多对多关系中添加一对多关系。

我想知道我是否需要另一种关系,如果需要,该怎么做。或者如果我可以使用带有额外属性的现有数据透视表?

更多详情

这张来自我的数据透视表的屏幕截图显示了我如何管理我的连接(也称为“朋友”):当两个联系人都接受连接时,status 等于 1。到目前为止一切都很好,很多Laravel 中的多对多关系系统完美地管理了这一点,一切都运行良好。

但是现在,我想在这些联系中添加一个“收藏”系统,一个用户可以添加另一个用户作为收藏联系人,但这显然不一定是相互的感觉,情况可能会变成这样:

当然,具有两个枢轴的多对多关系不会返回任何内容,因为 starred 字段在两条记录上的值不同。当我将第二条记录也更新为“1”时,关系会正确返回。

有没有办法同时使用数据透视表 (status) 和简单的额外属性 (starred),或者我需要另一个在别处建立的关系? (以及如何做到最好?)

【问题讨论】:

  • 你需要另一个数据透视表来主演

标签: laravel


【解决方案1】:

使用以下数据创建星标表

Schema::create('starrings', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('user_id');
            $table->unsignedInteger('starred_id');
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('starred_id')->references('id')->on('users')->onDelete('cascade');

        });

在您的用户模型上,添加以下内容:

    public function starred(){
        return $this->hasMany('App\Starring','starred_id');
    }
    public function starrings(){
        return $this->hasMany('App\Starring','user_id');
    }

【讨论】:

  • 谢谢,我会尽力告诉你
  • 完全使用您的代码,当我尝试为用户加注星标(使用$this->starred()->save($user))时,SQL 失败并显示Column not found: Unknown column 'user_id' in 'field list' (SQL: update users set user_id = 1 where id = 2)。我不明白,因为我在模型中添加了protected $table = 'starrings'
  • 附加用户使用 $user->starred()->attach($another_user)
  • 嗯,是的,我检查过了,这就是我问的原因:-) 根据您的代码,这是一对多的关系,而不是多对多的关系。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 2013-11-14
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多