我有一个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)
什么是问题,我该如何解决?
答案 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');