首页 > 解决方案 > Laravel 与枢轴同步多对多关系

问题描述

背景资料:

我正在 Laravel 中创建一个资产跟踪系统。

我的意思的图形说明

问题:

如何更新属性的值?我认为我的关系是正确的,因为我去了数据库并单独创建了每条记录并且它有效(如上图所示)。但我不知道如何构建代码以通过浏览器创建它们。

我的代码:

这是关系的照片

这是我的产品型号:

// Product.php
class Product extends Model {
    public function stocks()
    {
        return $this->hasMany(Stock::class)->orderBy('barcode', 'asc');
    }

    public function attributes()
    {
        return $this->hasMany(Attribute::class);
    }
}

这是我的属性模型:

// Attribute.php
class Attribute extends Model {
    public function getValueByBarcode($stock)
    {
        return $this->values()->whereBarcode($stock)->first()->value ?? '';
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function stocks()
    {
        return $this->belongsToMany(Stock::class);
    }

    public function values()
    {
        return $this->belongsToMany(Stock::class)->select('value');
    }

这是我的库存模型:

// Stock.php
class Stock extends Model {
    public function product()
    {
        return $this->belongsTo(Product::class);
    }

    public function attributes()
    {
        return $this->belongsToMany(Attribute::class)->withPivot('value');
    }

标签: laraveleloquent

解决方案


如果您必须从产品同步,那么关系应该属于许多带有数据透视表的关系。像这样...

// Product.php

class Product extends Model {

    public function **attributeStock**()
    {
        return $this->belongsToMany(Attribute::class, 'attribute_stock', 'product_id', 'stock_id')->withPivot('value');
    }
}

然后访问其他属性尝试其中一种方法。

$product->attributeStock()->attach($attributeId, ['value' => $value]); 
$product->attributeStock()->sync([$attributeId => ['value' => $value]]); 
Product::find(1)->attributeStock()->save($attributeId, ['value' => $value]);

如果您仍然面临处理该方法的任何困难,请告诉我。


推荐阅读