Я столкнулся с необычной ошибкой при использовании функции save () Laravel. Это ошибка:
SQLSTATE[42601]: Syntax error: 7 ERROR: zero-length delimited identifier at or near """"
LINE 1: ...pdate "t_h_ledger_sheet" set "o_memo1" = $1 where "" is null
^ (SQL: update "t_h_ledger_sheet" set "o_memo1" = 1234 where "" is null)
Может кто-нибудь знает, чем это вызвано и что можно сделать, чтобы это исправить? Вот моя модель:
<?php
namespace App\Model;
use Illuminate\Database\Eloquent\Model;
class LedgerSheet extends Model
{
protected $table = 't_h_ledger_sheet';
protected $primaryKey = null;
public $incrementing = false;
public $timestamps = false;
}
Отсутствие первичного ключа вызывает ошибку?
Обновлено: Вот что я сделал. Также дополнительная деталь: эта таблица должна содержать только 1 строку данных.
$memos = LedgerSheet::first();
if ($memos == null) {
$memos = new LedgerSheet;
}
$o_memo1 = "ASDF";
$o_memo2 = "ASDF";
$o_memo3 = "ASDF";
$o_memo4 = "ASDF";
$o_memo5 = "asdf";
$o_memo6 = "asdf";
$o_memo7 = "asdf";
$o_memo8 = "asdf";
DB::transaction(function() use($memos, $o_memo1, $o_memo2, $o_memo3, $o_memo4, $o_memo5, $o_memo6, $o_memo7, $o_memo8) {
$memos->o_memo1 = $o_memo1;
$memos->o_memo2 = $o_memo2;
$memos->o_memo3 = $o_memo3;
$memos->o_memo4 = $o_memo4;
$memos->o_memo5 = $o_memo5;
$memos->o_memo6 = $o_memo6;
$memos->o_memo7 = $o_memo7;
$memos->o_memo8 = $o_memo8;
try{
$memos->save();
}catch(\Exception $e){
error_log($e->getMessage()); // insert query
}
});
2-ОЕ РЕДАКТИРОВАНИЕ УДАЛЕНИЕ ЗАВЕРШЕНИЯ транзакции: $ memos = LedgerSheet :: first ();
if ($memos == null) {
$memos = new LedgerSheet;
}
$memos->o_memo1 = "ASDF";
$memos->o_memo2 = "ASDF";
$memos->o_memo3 = "ASDF";
$memos->o_memo4 = "ASDF";
$memos->o_memo5 = "asdf";
$memos->o_memo6 = "asdf";
$memos->o_memo7 = "asdf";
$memos->o_memo8 = "asdf";
try{
$memos->save();
}catch(\Exception $e){
error_log($e->getMessage()); // insert query
}
Обновлено: Невозможно использовать функцию save () в Модели без первичного ключа.
@nakov, я отредактировал это сейчас
Можете ли вы попробовать, добавив все столбцы в массив $fillable, например: protected $fillable = ['o_memo1' ....];, хотя полученная вами ошибка немного сбивает с толку.
@nakov Пробовал. Не хорошо :(
Я также использую версию Laravel Framework 5.6.29.
зачем вам превращать это в транзакцию, когда вы работаете только с одной таблицей?
Кстати, использование транзакции неверно, смотрите здесь: laravel.com/docs/master/database#database-transactions
@nakov Я удалил транзакцию, но она по-прежнему не работает.
По-прежнему возникает та же ошибка? Не могли бы вы обновить приведенный выше код до того, что вы изменили?
@nakov там, редактировал
Можете выложить свою модель класса LedgerSheet?
@DavidODW это уже написано выше
Ваш код показывает только запрос INSERT. Откуда идет запрос UPDATE?
@JonasStaudenmeir Я инициализирую значение либо первой строкой таблицы, либо новой моделью LedgerSheet. Насколько я понял, функция save() выполняет функцию UPDATE или INSERT в зависимости от инициализированной модели (полученные данные или new) перед выполнением функции save().
Вы не можете обновить модель без первичного ключа.
@JonasStaudenmeir Я верю, что вы можете, учитывая тот факт, что вы можете установить первичный ключ равным нулю внутри моделей Eloquent. Я также пробовал это с другой таблицей, у которой нет первичного ключа. Я просто не понимаю, почему эта таблица выдает эту ошибку.
Вы не можете: как база данных узнает, какую строку нужно обновить? Невозможно идентифицировать это. Вы жестяная банка устанавливаете первичный ключ на null, но это не означает, что ваша модель все еще работает. Laravel не может помешать вам сделать это.
@JonasStaudenmeir Я считаю, что вы правы. : o мой плохой.






Глядя на документацию для PostgreSQL, я считаю, что для вас это не удается в самой первой строке, где вы пытаетесь получить первый элемент, потому что вы не устанавливаете никаких критериев, на которые нужно смотреть.
Ты пробовал:
LedgerSheet::all()->first();
отредактировал код, и он по-прежнему выдает ту же ошибку :(
попробуйте сбросить только dd(LedgerSheet::all()), вы получаете от него какие-нибудь данные?
а затем, когда вы добавляете к этому ->first(), он возвращает правильный или вот где он взрывается?
нет, он по-прежнему отображает первые данные, и на самом деле он выдает ошибку, когда я выполняю метод save (), а не когда я получаю данные
Можете ли вы показать нам запрос, который вы пытаетесь сделать? Потому что отсутствие первичного ключа не должно вызывать ошибки.