Laravel получение ошибки sql при попытке дать уникальную проверку поля

Это из проверки, которую я использовал для проверки формы тега

public function rules()
{
     return [
         'name' => 'required|max:50|min:3|unique:tags,name,'.$this->tag,
     ];
}

Мой код контроллера

public function update(TagValidation $request, Tag $tag )
{
    $tag->update($request->all());
}

Я пытаюсь избежать проблемы с уникальной валидацией при обновлении. После использования

unique:tags,name,'.$this->tag

Я получаю ошибку ниже sql

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name:"abc"' in 'where clause' (SQL: select count(*) as aggregate from `tags` where `name` = abc and `name:"abc"` <> {"id":14 and `created_at:"2020-06-13T16:24:36`.`000000Z"` = updated_at:"2020-06-13T16:46:44.000000Z"}) 

Но у меня есть столбец имени в базе данных, и хранилище работает нормально, если я не использую тег $this-> при проверке.

2 ответа

Решение

Вы должны передать идентификатор записи, которую хотите игнорировать, уникальное правило, для которого, как я предполагаю, является этот тег:

 'name' => 'required|max:50|min:3|unique:tags,name,'. $this->tag->id,

Или вы можете использовать объектную версию правила, которому вы можете просто передать модель напрямую:

'name' => [
    'required', 'max:50', 'min:3', 
    Rule::unique('tags')->ignore($this->tag),
],

Будьте осторожны, потому что уникальная проверка

уникальный: таблица, столбец, кроме idColumn

Вы передаете значение тега, но это не обязательно

Фактически вы используете:

return [
   'name' => 'required|max:50|min:3|unique:tags,name,'.$this->tag,
];

но вам нужно использовать это. Я покажу вам рабочий пример для использования той же проверки в хранилище и обновлении (метод POST и PUT):

public function rules()
{
    if ($this->method() == 'PUT') 
    {
        return [
             'name' => 'required|unique:tags,name,'.$this->id.',id',
        ];
    }elseif ($this->method() == 'POST'){
         return [
             'name' => 'required|unique:tags,name'
         ];
    }
}

Включено в Laravel 7*, вы можете использовать модель напрямую

public function rules()
{
    // Check Create or Update
    if ($this->method() == 'PUT') 
    {
        return [
            'name' => 'required|unique:App\Tag,name,'.$this->id.',id'
        ];
    }elseif ($this->method() == 'POST'){
        return [
            'name' => 'required|unique:App\Tag,name'
        ];
    }
}
Другие вопросы по тегам