“许多对多个多态关系中的'字段列表'中的未知列'tag_tag_id'”错误

时间:2017-12-16 05:34:05

标签: php laravel laravel-5.5

我有一个Tag这样的模型:

class Tag extends Model
{
    protected $primaryKey = 'tag_id';

    protected $fillable = ['name'];

    public function products()
    {
        return $this->morphedByMany(Product::class, 'taggable');
    }
}

另一方面,有一个像这样的产品型号:

class Product extends Model
{
    protected $primaryKey = 'product_id';
    protected $fillable = ['code', 'title', 'description'];

    public function tags()
    {
        return $this->morphToMany(\Modules\Tag\Entities\Tag::class, 'taggable');
    }

}

正如您所看到的,它们之间存在多种多态关系。但每次我想存储一个有这样标签的产品时:

public function store(ProductFormRequest $request)
{
    $newProduct = Product::create($request->all());

    if ($request->has('tags')) {
        $newProduct->tags()->sync($request->get('tags'));
    }

    return $this->item($newProduct, new ProductTransformer);
}

我收到了这个错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tag_tag_id' in 'field list' (SQL: select `tag_tag_id` from `taggables` where `taggable_id` = 4 and `taggable_type` = Modules\\Product\\Entities\\Product)

什么是问题,我该如何解决?

1 个答案:

答案 0 :(得分:2)

Many To Many Polymorphic Relations

products
    id - integer
    name - string

tags
    id - integer
    name - string

taggables
    tag_id - integer
    taggable_id - integer
    taggable_type - string

如您所见,taggables表中的默认“标记ID”列为tag_id。这意味着,the name of the table in the singular + _ + primary key name。由于您将主键指定为tag_id,因此查询正在搜索tag_tag_id

您有两种解决方案:

1)坚持约定并使用默认的id作为主键。

2)将参数传递给morphToMany,指定primaryKey为tag_id。在这里,您拥有接受morphToMany方法的所有参数:MorphToMany API

我不确定哪一个是正确的(我认为是$ relatedPivotKey),但你应该尝试($ foreignPivotKey,$ relatedPivotKey,$ parentKey或$ relatedKey)。传递您未更改的默认值。

这样的事情:$this->morphToMany(\Modules\Tag\Entities\Tag::class, 'taggable', null, null, 'tag_id');