首页 > 解决方案 > 有没有办法在 Laravel 中静默中止创建模型?

问题描述

我有一个 ProductTags 模型,它与我的产品存在一对多关系。我需要防止相同的模型 ID 和标签在多个记录中重复。在我的迁移中,$table->unique(['product_uuid', 'tag']);但这意味着如果我尝试创建一个与现有模型重复的模型,我会违反完整性约束。

因此,当创建 ProductTags 模型时,在保存它之前,它需要检查数据库中的现有版本,然后中止自己的创建。我更愿意在模型中执行此操作,因此我只需实现一次,而不是控制器和工厂。

我试图重写create方法来拦截它,但是当我播种时,它似乎根本没有被调用。

class ProductTag extends Model
{
    protected $fillable = [
        'product_uuid', 'tag',
    ];

    public function create($data){
        if(
            ProductTag::where('product_uuid', '=', $data['product_uuid'])->
            where('tag','=', $data['tag'])
        ){
            return false;
        }
        return parent::create($data);
    }
}

标签: laravel

解决方案


使用firstOrCreate怎么样

public function create($data)
{
    return self::firstOrCreate( // self or use ProductTag
        [
            'product_uuid' => $data['product_uuid'],
            'tag' => $data['tag']
        ],
        $data
    );
}

我只是不确定你是否可以在 上调用它self,但你肯定可以在模型上调用它。

这将ProductTag在任何情况下返回一个 back 实例,因此您可以链接其他方法


推荐阅读