Использование функции save () в модели без первичного ключа вызывает ошибку

Я столкнулся с необычной ошибкой при использовании функции 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 19.10.2018 09:50

@nakov, я отредактировал это сейчас

Potayto 19.10.2018 10:07

Можете ли вы попробовать, добавив все столбцы в массив $fillable, например: protected $fillable = ['o_memo1' ....];, хотя полученная вами ошибка немного сбивает с толку.

nakov 19.10.2018 10:12

@nakov Пробовал. Не хорошо :(

Potayto 19.10.2018 10:13

Я также использую версию Laravel Framework 5.6.29.

Potayto 19.10.2018 10:15

зачем вам превращать это в транзакцию, когда вы работаете только с одной таблицей?

nakov 19.10.2018 10:15

Кстати, использование транзакции неверно, смотрите здесь: laravel.com/docs/master/database#database-transactions

nakov 19.10.2018 10:20

@nakov Я удалил транзакцию, но она по-прежнему не работает.

Potayto 19.10.2018 10:32

По-прежнему возникает та же ошибка? Не могли бы вы обновить приведенный выше код до того, что вы изменили?

nakov 19.10.2018 10:33

@nakov там, редактировал

Potayto 19.10.2018 10:41

Можете выложить свою модель класса LedgerSheet?

DavidODW 19.10.2018 10:43

@DavidODW это уже написано выше

Potayto 19.10.2018 10:48

Ваш код показывает только запрос INSERT. Откуда идет запрос UPDATE?

Jonas Staudenmeir 19.10.2018 18:58

@JonasStaudenmeir Я инициализирую значение либо первой строкой таблицы, либо новой моделью LedgerSheet. Насколько я понял, функция save() выполняет функцию UPDATE или INSERT в зависимости от инициализированной модели (полученные данные или new) перед выполнением функции save().

Potayto 22.10.2018 13:16

Вы не можете обновить модель без первичного ключа.

Jonas Staudenmeir 22.10.2018 15:57

@JonasStaudenmeir Я верю, что вы можете, учитывая тот факт, что вы можете установить первичный ключ равным нулю внутри моделей Eloquent. Я также пробовал это с другой таблицей, у которой нет первичного ключа. Я просто не понимаю, почему эта таблица выдает эту ошибку.

Potayto 23.10.2018 05:55

Вы не можете: как база данных узнает, какую строку нужно обновить? Невозможно идентифицировать это. Вы жестяная банка устанавливаете первичный ключ на null, но это не означает, что ваша модель все еще работает. Laravel не может помешать вам сделать это.

Jonas Staudenmeir 23.10.2018 06:04

@JonasStaudenmeir Я считаю, что вы правы. : o мой плохой.

Potayto 15.11.2018 04:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
18
110
1

Ответы 1

Глядя на документацию для PostgreSQL, я считаю, что для вас это не удается в самой первой строке, где вы пытаетесь получить первый элемент, потому что вы не устанавливаете никаких критериев, на которые нужно смотреть.

Ты пробовал:

LedgerSheet::all()->first();

отредактировал код, и он по-прежнему выдает ту же ошибку :(

Potayto 19.10.2018 10:54

попробуйте сбросить только dd(LedgerSheet::all()), вы получаете от него какие-нибудь данные?

nakov 19.10.2018 10:56

а затем, когда вы добавляете к этому ->first(), он возвращает правильный или вот где он взрывается?

nakov 19.10.2018 11:14

нет, он по-прежнему отображает первые данные, и на самом деле он выдает ошибку, когда я выполняю метод save (), а не когда я получаю данные

Potayto 19.10.2018 11:20

Другие вопросы по теме