代码之家  ›  专栏  ›  技术社区  ›  wivku

Laravel Nova+多态标签:当附加“没有变形地图定义”

  •  0
  • wivku  · 技术社区  · 3 年前

    我在Laravel中设置了标签,就像在 Laravel documentation 实例

    // App/Models/MyModel.php
    
    public function tags()
    {
       return $this->morphToMany(Tag::class, 'taggable');
    }
    

    我把它添加到我的Nova v3字段列表中,就像在 Nova documentation :

    // App/Nova/MyModel.php
    
    public function fields(Request $request)
    {
      //...
      MorphToMany::make('Tags')
    }
    

    现有标签在Nova中显示得很好,但当我尝试附加时,我会收到消息:

    没有为模型[App\Models\Tag]定义变形贴图。出现了问题 提交表格。

    分离标记时,错误为:

    没有为模型定义变形贴图 [Illuminate\Database\Eloquent\Relations\MorphPivot]

    但是,标签毕竟是分离的,并且在刷新页面后就不见了。

    手动附加/分离时没有问题:

    $myModel->tags()->attach($tag)
    

    建议?

    使现代化 我的 AppServiceProvider.php 包含:

    Relation::enforceMorphMap([
      'myModel' => 'App\Models\MyModel',
    ]);
    

    当我禁用此功能时 enforceMorphMap Nova没有问题。但那是多余的,我不想写 App\Models\MyModel 到DB,但仅限于: myModel .

    我尝试添加到 enforceMorphMap : 'tag' => 'App\Models\Tag' (尽管这从未写入DB),但没有任何效果。

    似乎与此有关 Nova issue ?
    不清楚解决方案/解决方法是什么。

    0 回复  |  直到 3 年前
        1
  •  2
  •   wivku    3 年前

    确实与上述有关 Nova issue .
    改变 enforceMorphMap morphMap 作品

    Relation::morphMap([
      'myModel' => 'App\Models\MyModel',
    ]);
    
    
        2
  •  0
  •   free2idol1    1 年前

    这里有同样的问题。。。看完医生后,我明白了:

    使用 Relation::enforceMorphMap 意味着,它将切换 $requireMorphMap 属性位于:

    public static function requireMorphMap($requireMorphMap = true)
        {
            static::$requireMorphMap = $requireMorphMap;
        }
    

    然后无论何时调用Tag实例的变形关系,它都会调用 getMorphClass() 在那里它将检查 $requireMorphMap 是真的通过 Relation::requiresMorphMap() ,如果是,则将引发异常。

     public function getMorphClass()
        {
           ...
            if (Relation::requiresMorphMap()) {
                throw new ClassMorphViolationException($this);
            }
    
            return static::class;
        }
    

    解决方案

    1/将新密钥添加到 Relation::enforceMorphMap() 导致错误的模型。

    2/将呼叫替换为 关系::enforceMorphMap() 具有 Relation::morphMap() 。这将不再需要模型的变形贴图。

    灵感来源: https://ralphjsmit.com/laravel-fix-no-morph-map-defined