在 Laravel 5.2 中使用多态多对多关系时的陈旧对象

Stale objects when using polymorphic many to many relationships in Laravel 5.2

我写了一个名为 Categorizable 的 class,它允许扩展它的 class 和 class Category 之间的多态多对多关系.它工作得很好,但我注意到,如果我调用一个方法将类别添加到可分类对象,它会在连接 table 上添加条目,但我的实际对象没有更新。如果我尝试在我的对象上调用 categories,它不会更新为数据库中的内容。我想让我的对象保持最新状态,这样我就不必在每次添加类别时都为它查询数据库。

Categorizable.php

class Categorizable extends Model{

public function categories(){
    return $this->morphToMany(Category::class, 'categorizable');
}

public function addCategory(\App\Category $category){
    if ( $this->isValidCategory($category) ){
        if ( $this->hasCategory($category) ){
            return false;
        }
        else{
            $this->categories()->save($category);
            return true;
        }
    }
    else{
        return false;
    }
}

public function removeCategory(\App\Category $category){
    if ( $this->isValidCategory($category) ) {
        if ($this->hasCategory($category)) {
            $this->categories()->detach($category);
            return true;
        }
        else {
            return false;
        }
    }
    else{
        return false;
    }
}

public function hasCategory(\App\Category $category){
    return $this->categories->contains($category);
}

public function isValidCategory(\App\Category $category){
    if ( $category->category_type === get_class( $this ) ){
        return true;
    }
    else{
        return false;
    }
}

如果 Laravel 5.2 无法做到这一点或被认为是不好的做法,请说明。如果您对我如何改进这一点有任何建议,也欢迎。谢谢。

考虑在控制器中处理此问题,如 https://laravel.com/docs/5.4/eloquent-relationships#updating-many-to-many-relationships

中所述

它将简化您想要实现的目标。假设类别与文章相关,控制器是 ArticleController。 $article 是模型对象,并且 isValidCategory() 检查已完成。添加类别或删除类别变为:

$article->categories()->attach($category->id);
$article->categories()->detach($category->id);

重置该文章的所有关系:

$article->categories()->detach();
$article->categories()->attach($categories); //flat array

或者在一行中执行此操作:

$article->categories()->sync($categories);

请记住,您可以使用 one id 或 array id,例如 [1, 2, 3]

注意: $category->id是假设,如果$category是id,那么显然,使用$category