laravel多对多检查是否有明显更改

3htmauhk  于 2022-11-18  发布在  其他
关注(0)|答案(1)|浏览(131)

我的产品模型与属性和attributes_values具有多对多关系
当我更改属性值时:

foreach ($attribute_list as $key => $value) {
     ...
     $attribute = ProductsAttributes::where('code', '=', $key)->first();
     $attr_values = $attribute->values()->updateOrCreate(
       ['id' => $value_id],
       $value
     );
     $old_product_attributes = $old_product_attributes->merge([$key => $value_id]);
     ...
}

我想检查是否有任何列已更新,但如果我

dd($attr_values->isDirty());

它返回false。但在更新期间更改了1列。
目前我检查更改的方式是使用同步:

$syncResult = $product->attr_values()->sync($old_product_attributes);

if (collect($syncResult)->flatten()->isNotEmpty()) {
  $product->updated_at = now();
}

但在这里,如果我dd($syncResult),它返回空,因为没有进行任何更改。如果我检查products_atr_values表,有更改的列已更新为updated_at。
我做错了什么?

关系:

产品型号有:

public function attr_values()
{
    return $this->belongsToMany('Modules\Products\Entities\ProductsAttributesValues', 'products_attributes_values_prod', 'product_id', 'value_id');
}

产品属性模型具有:

public function values()
{
    return $this->hasMany('Modules\Products\Entities\ProductsAttributesValues', 'attribute_id');
}

产品属性值模型具有:

public function attributes()
{
    return $this->belongsTo('Modules\Products\Entities\ProductsAttributes');
}

public function products()
{
    return $this->belongsToMany('Modules\Products\Entities\Products', 'products_attributes_values_prod', 'value_id', 'product_id');
}

public function attr_val_prod()
{
    return $this->belongsToMany('Modules\Products\Entities\ProductsAttributesValuesProd', 'value_id');
}
rkkpypqq

rkkpypqq1#

isDirty()无法运作,因为当模型属性变更时会使用,但尚未储存在数据库中。
如果您只需要更改产品,则可以使用ProductsAttributesValues模型中的updated_at字段:

protected $touches = ['products'];

或者如果您需要更改更多内容,则可以在ProductsAttributesValues中再次使用保存的事件:

protected static function booted()
    {
        static::saved(function ($model) {
            $model->products()->update(['value' => $value]);
        });
    }

相关问题