Есть ли способ молча прервать создание модели в Laravel? - PullRequest
0 голосов
/ 03 октября 2019

У меня есть модель ProductTags, которая связана с моим продуктом один ко многим. Мне нужно, чтобы один и тот же идентификатор модели и тег не дублировались в нескольких записях. В миграции у меня есть $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);
    }
}

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Как насчет использования firstOrCreate

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

Я просто не уверен, что вы можете вызвать его на self, но вы точно можете сделать это на модели.

В любом случае это вернет экземпляр ProductTag, чтобы вы могли связать другие методы

0 голосов
/ 03 октября 2019

Вы можете использовать функцию ->exists() в построителе запросов, чтобы проверить, существует ли запись для этого запроса:

public function create($data){
    $productTag = self::where('product_uuid', $data['product_uuid'])
        ->where('tag', $data['tag']);

    if ($productTag->exists()) {
        return false;
    }

    return self::create($data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...