Laravel(v5.2.45)引号和双引号

时间:2018-07-19 21:35:55

标签: php laravel postgresql laravel-5

我正在尝试使用Laravel(v5.2.45)DB Seeder在Postgres DB中初始化查找表。

运行它时,得到以下输出:

[Illuminate\Database\QueryException]
SQLSTATE[42703]: Undefined column: 7 ERROR:  column "lkup_type" of relation "syslookups" does not exist
LINE 1: insert into "syslookups" ("lkup_type", "lkup_text") values (...
                               ^ (SQL: insert into "syslookups" ("lkup_type", "lkup_text") values (0, Employee))

这是播种机代码:

<?php

use Illuminate\Database\Seeder;

class SyslookupsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        DB::table('syslookups')->delete();

        DB::table('syslookups')->insert(
            ['lkup_type'=>0, 'lkup_text'=>"Employee"],
            ['lkup_type'=>0, 'lkup_text'=>"Member"],
            ['lkup_type'=>1, 'lkup_text'=>"Open"],
            ['lkup_type'=>1, 'lkup_text'=>"Closed"],
            // .. many more here
            ['lkup_type'=>5, 'lkup_text'=>"Yes"],
            ['lkup_type'=>5, 'lkup_text'=>"No"],
            ['lkup_type'=>6, 'lkup_text'=>"Work Phone"],
            ['lkup_type'=>6, 'lkup_text'=>"Fax"],
            ['lkup_type'=>6, 'lkup_text'=>"Home Phone"],
            ['lkup_type'=>6, 'lkup_text'=>"Cell Phone"]
        );    
    }
}

任何想法如何使它不使用双引号?我试过在表名和列名周围用双引号引起来,结果相同。 该表有一个名为lkup_id的串行列以及默认的created_atupdated_at列,我是否也需要为它们填充种子?

编辑

我发现引起双引号的行。 PostgresGrammar.php,function wrapValue(),但是当我更改此行时:

return '"'.str_replace('"', '""', $value).'"';

对此:

return str_replace('"', '""', $value);

我现在收到此错误:

[Illuminate\Database\QueryException]
 SQLSTATE[42703]: Undefined column: 7 ERROR:  column "lkup_type" of relation "syslookups" does not exist
 LINE 1: insert into syslookups (lkup_type, lkup_text) values ($1, $2...
                             ^ (SQL: insert into syslookups (lkup_type, lkup_text) values (0, Employee))

在我看来,这似乎是Postgres的正确SQL ...

2 个答案:

答案 0 :(得分:0)

Laravel的查询生成器似乎总是将列名放在Postgres的双引号内。我看不到任何禁用此选项的选项,也没有使用postgres。

在查询构建器中解决此问题的一种方法是将列名放在原始表达式中,但这不适用于您的insert语句,因为原始表达式将是数组的无效键。

似乎,如果您不想编写自己的驱动程序或修改Laravel的代码,则必须为此使用原始语句。

DB::insert('INSERT INTO syslookups (lkup_type, lkup_text) ...');

长话短说,Laravel可能会错误地假设所有列都应加引号,因此您可能要确保表定义与该约定匹配。

答案 1 :(得分:0)

好的,我发现引起双引号的行。在PostgresGrammar.php中,
 function wrapValue()更改此行:

return '"'.str_replace('"', '""', $value).'"';

对此:

return str_replace('"', '""', $value);

我还发现我没有在表名前面加上模式名,并且列名实际上是不正确的。我猜是该死的老眼睛;-)

我还需要重置lkp_id列的串行序列,该序列在播种器中未更新。稍后,我将添加created_at和updated_at值。谢谢你看这个...

DB::table('eddie.syslookups')->delete();
DB::statement('ALTER SEQUENCE eddie.syslookups_lkp_id_seq RESTART');
DB::table('eddie.syslookups')->insert([
    ['lkp_type'=>0, 'lkp_text'=>"Employee"],
    ['lkp_type'=>0, 'lkp_text'=>"Member"],
    ['lkp_type'=>1, 'lkp_text'=>"Open"],
    ['lkp_type'=>1, 'lkp_text'=>"Closed"],
    ['lkup_type'=>1, 'lkup_text'=>"Closed"],
    // .. many more here
    ['lkup_type'=>5, 'lkup_text'=>"Yes"],
    ['lkp_type'=>5, 'lkp_text'=>"No"],
    ['lkp_type'=>7, 'lkp_text'=>"Work Phone"],
    ['lkp_type'=>7, 'lkp_text'=>"Fax"],
    ['lkp_type'=>7, 'lkp_text'=>"Home Phone"],
    ['lkp_type'=>7, 'lkp_text'=>"Cell Phone"]]
);