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

Laravel雄辩忽略了多态关系中的突变

  •  1
  • GluePear  · 技术社区  · 6 年前

    我有一个模型 Image 一个模型 Metadata . 元数据 可以属于 图像 ,但它也可以属于其他模型,因此我使用多态关系:

    Image.php:

    public function metadata()
    {
        return $this->morphMany('App\Metadata', 'content');
    }
    

    Metadata.php:

    public function content()
    {
        return $this->morphTo();
    }
    
    public function setAuthorAttribute($value)
    {
        $this->attributes['author'] = strtoupper($value);
    }
    

    当我想创建一个包含元数据的图像时,如下所示:

    ["author" => "Foo Bar"]
    

    我使用此代码:

    $image = Image::create($request);
    
    $image->metadata()->create($this->mapMetadata($request));
    

    这很管用。但当我尝试用元数据更新图像时,使用以下代码:

    $image = Image::findOrFail($id);   
    
    $image->update($request);
    
    $image->metadata()->update($this->mapMetadata($request));
    

    数据被更新,但我的转换器被忽略。换句话说,在创建时, author 将变为大写,但更新时不会。

    编辑:元数据表的迁移:

    $table->increments('id');   
    $table->string('author')->nullable();
    $table->unsignedInteger('content_id');
    $table->string('content_type');
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   GluePear    6 年前

    你可以使用无证件的 morphOne 关系。

    $image->metadata->update(..) 应该工作。