Laravel, не могу обновить софт-удаленное значение - PullRequest
0 голосов
/ 05 мая 2018

У меня есть эти значения в моей БД:

id - name - created_at - updated_at - deleted_at
------------------------------------------------
1  - John - 2018-11-11 - 2018-11-11 -  (NULL)
2  - John - 2018-11-11 - 2018-11-11 -  2018-11-11

Если я ищу «Джон» с помощью моего Datatable (Yajra), я вижу только Джона с id=1, потому что я использую программные средства удаления. Моя модель такая:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class MyModel extends Model
{
    use SoftDeletes;

    protected $fillable = ['name'];

    protected $dates = ['deleted_at'];
}

Когда я удаляю (уничтожаю) реестр, он ставит дату в deleted_at, что правильно. Но когда я хочу изменить (обновить) John, Валидатор выдает мне сообщение об ошибке, что это значение уже используется. Мой метод обновления такой:

public function update(Request $request, $id)
{
    $rules = array(
        'name' => 'unique:my_table'
    );

    $validator = Validator::make($request->all(), $rules);

    if ($validator->passes()) {
        MyModel::find($id)->update($request->input());
        return redirect()->route('myroute')->withFlashSuccess('Ok!');
    } else {
        return redirect()->back()->withInput()->withErrors($validator);
    }
}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Этот человек написал сообщение в блоге, которое, похоже, решит вашу проблему:

https://wisdmlabs.com/blog/laravel-soft-delete-unique-validations/

Я не уверен на 100%, что вы хотите сделать это, хотя позже вы можете захотеть использовать метод restore (), чтобы вернуть данные, удаленные программным способом. В какой момент вы столкнетесь.

0 голосов
/ 05 мая 2018

Проблема не имеет ничего общего с SoftDeletes, это проблема проверки. Правило проверки unique является особенным, потому что в случае обновления ему необходимо знать, какую запись он может игнорировать при выполнении проверки. В фоновом режиме правило выполняет запрос SQL, например

IF EXISTS (
    SELECT id
    FROM   my_table
    WHERE  name = 'some value'
) 
    SELECT  1
ELSE 
    SELECT  0

(это может быть не точный запрос, но похожий).

Как видите, запрос не учитывает, выполняете ли вы обновление или нет. Поскольку ваша сущность уже существует, она вернет 1 и, следовательно, провалит проверку, поскольку считает, что проверяемое значение не является уникальным.

Но на самом деле есть способ заставить проверку работоспособности обновлений. Вам просто нужно добавить id существующего объекта (который проверяется) в качестве третьего параметра к правилу проверки. Так что ваши правила должны выглядеть примерно так:

$rules = [
    'name' => 'unique:my_table,name,'.$id
];

Обратите внимание, что для правила проверки unique есть и второй параметр - столбец таблицы базы данных, в которой вы хотите выполнить поиск.


Edit:

В случае, если ограничение уникальности относится только к не удаленным записям, что означает, что уникальное значение может быть использовано повторно, если другие вхождения того же значения помечены как удаленные, тогда может потребоваться добавить дополнительное предложение where() к правилу проверки unique. Для этого четвертому параметру необходимо задать имя столбца identifier, а затем мы можем добавить дополнительные предложения where в виде пар из двух параметров.

$rules = [
    'name' => 'unique:my_table,name,'.$id.',id,deleted_at,NULL'
];

Это добавит where('deleted_at', 'NULL') (или whereNull('deleted_at')) к запросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...