在没有主键的模型上使用save()函数会产生错误

时间:2018-10-19 07:49:04

标签: laravel postgresql eloquent

使用Laravel的save()函数时遇到一个异常错误。这是错误:

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
    }

});

第二次编辑删除交易包装:     $ 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()函数。

1 个答案:

答案 0 :(得分:0)

查看PostgreSQL的文档,我相信对您来说它在第一行会失败,因为您没有设置要查看的标准,所以您尝试获取第一个元素。

您尝试过吗:

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