我正在关注有关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()
吗?
答案 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