Laravel在json领域有很多

时间:2017-11-10 12:31:13

标签: laravel laravel-5 laravel-5.4

我想使用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,任何帮助或帮助都会很棒。不幸的是,我将无法更改数据库结构。我需要按原样使用它。

提前致谢。

2 个答案:

答案 0 :(得分:4)

继续发表评论,理想情况下我只会做以下事情:

  • 创建名为product_colors的数据透视表以存储产品&色彩协会。所以这种关系将变成多对多。

我会认真推荐。由于您已经写过,您无法更改数据库结构。

例如,检索颜色的产品列表。您的解决方案可能如下所示:

在Product模型中创建一个mutator,将颜色json字段转换为数组:

public function setColor()
{
    return json_decode($this->color, true);
}

在Color模型中创建一个函数,用于检索所有产品的列表,然后过滤列表以返回包含特定颜色的产品

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');
    }
}