Почему в этот красноречивый запрос DB :: raw не передаются параметры, в результате чего возникает ошибка "SQLSTATE [HY093]: недопустимый номер параметра" - PullRequest
0 голосов
/ 26 мая 2020

У меня есть довольно простой запрос:

Category::whereRaw('hierarchy LIKE ?', [$old_hierarchy . '>%'])
    ->update([
        'hierarchy' => DB::raw("REPLACE(hierarchy, ?, ?)", [$old_hierarchy, $new_hierarchy])
    ]);

И он продолжает выдавать мне эту ошибку:

SQLSTATE[HY093]: Invalid parameter number (SQL: update `categories` set `hierarchy` = REPLACE(hierarchy, 2020-05-25 22:30:55, first_param>%), `categories`.`updated_at` = ? where hierarchy LIKE ?)

Похоже, что никакие параметры не передаются в DB :: raw. Есть идеи, что происходит?

1 Ответ

0 голосов
/ 26 мая 2020

Хорошо, это настолько странно, что у меня нет объяснения этому, но вот решение:

1) Прежде всего вам нужно явно обновить updated_at самостоятельно, иначе Laravel попробует и сделай это сам и сделай из всего большой беспорядок.

2) По какой-то неизвестной причине первоначальная установка просто не смогла присвоить переменные заполнителю ?: DB::raw("REPLACE(hierarchy, ?, ?)", [$old_hierarchy, $new_hierarchy])

3) Мне пришлось сделать это, используя setBindings, но, вдобавок ко всему, я не смог назначить их все с помощью этого метода, потому что они снова испортились бы, поэтому сделал это только для операторов DB::raw.

Category::setBindings([$old_hierarchy, $new_hierarchy, now()])
    ->whereRaw("hierarchy LIKE ?", [$old_hierarchy . '>%'])
    ->update([
        'hierarchy' => DB::raw("REPLACE(hierarchy, ?, ?)"),
        'updated_at' => DB::raw("?")
    ]);

Если у кого-нибудь есть объяснения всей этой безумной вещи, дайте мне знать

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