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'
];
}
}