我想使用Eloquent'hasMany'关系获得与certian颜色相关的所有产品。但是,与产品相关的颜色存储在产品表中的json
值中。
颜色表:
-------------
id | color
-------------
1 Black
2 Brown
3 Gray
产品表:
------------------------------
id | name | color
------------------------------
1 Shoe Name ["1","2"]
2 Shoe Name ["2","3"]
颜色模型
public function products()
{
return $this->hasMany(Product::class, 'color');
}
但不幸的是,当我这样做时,没有任何回报
dd(Color::products());
我知道问题是试图在json字段上进行hasMany
,任何帮助或帮助都会很棒。不幸的是,我将无法更改数据库结构。我需要按原样使用它。
提前致谢。
答案 0 :(得分:4)
继续发表评论,理想情况下我只会做以下事情:
product_colors
的数据透视表以存储产品&色彩协会。所以这种关系将变成多对多。 我会认真推荐。由于您已经写过,您无法更改数据库结构。
例如,检索颜色的产品列表。您的解决方案可能如下所示:
public function setColor()
{
return json_decode($this->color, true);
}
public function products()
{
return Product::all()->filter(function($product) {
return in_array($this->id, $product->color)) ? $product : null;
});
}
答案 1 :(得分:2)
我创建了一个具有JSON关系的软件包:https://github.com/staudenmeir/eloquent-json-relations
您可以像这样创建多对多关系:
class Product extends Model
{
use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;
protected $casts = [
'color' => 'json'
];
public function colors()
{
return $this->belongsToJson(Color::class, 'color');
}
}
class Color extends Model
{
use \Staudenmeir\EloquentJsonRelations\HasJsonRelationships;
public function products()
{
return $this->hasManyJson(Product::class, 'color');
}
}