使用数据透视表获取其他属性?

时间:2018-12-03 00:13:03

标签: laravel laravel-5 laravel-5.7

我正在关注有关Laracasts的多对多关系Laravel教程-https://laracasts.com/series/laravel-5-fundamentals/episodes/21

我面临的挑战是,我创建了数据透视表article_tag) to keep track of the many to many relations. Articles can have many tags, and tags can have many articles. So I can run sync etc to associate tagX tagY tagZ to article1`。但是,我还希望能够有选择地将关联标签之一设置为“ isGreenTag”。我可以在跟踪多对多关系的数据透视表中执行此操作吗?我可以添加一列“ is_green_tag”吗?

这是我的Article班级关系:

class Article extends Model {
   public function tags() {
      return $this->belongsToMany('App\Tag')->withTimestamps();
   }
}

这是我的Tag班级关系:

class Tag extends Model {
   public function articles() {
      return $this->belongsToMany('App\Articles');
   }
}

这是我对数据透视表的迁移:

public function up() {
    Schema.create('article_tag', function(Blueprint $table) {
        $table->integer('article_id')->unsigned()->index();
        $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');

        $table->integer('tag_id')->unsigned()->index();
        $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');

        $table->timestamps();
    });
}

我可以添加到数据透视表迁移$table->boolean('is_green_tag')->nullable()吗?

1 个答案:

答案 0 :(得分:4)

是的,可以给它一个默认的0而不是使其可以为空:

$table->boolean('is_green_tag')->default(0);

然后您可以修改Article类上的关系:

public function tags() {
    return $this->belongsToMany('App\Tag')->withPivot(['is_green_tag'])->withTimestamps();
}

一旦有了Article对象,就可以访问该属性:

foreach ($article->tags as $tag) {
    if ($tag->pivot->is_green_tag) {
        // some logic here
    }
}

要为is_green_tag保存$tagId

$article->tags()->attach($tagId, ['is_green_tag' => 1]);

Laravel文档:
https://laravel.com/docs/5.7/eloquent-relationships#many-to-many https://laravel.com/docs/5.7/eloquent-relationships#updating-many-to-many-relationships

相关问题