【问题标题】:Incorrect value for column with Laravel 4Laravel 4 列的值不正确
【发布时间】:2014-01-02 07:29:23
【问题描述】:

我在 Laravel 4 迁移中创建了一个列,如下所示:

public function up()
{
    Schema::create(
        'templates',
        function (Blueprint $table) {
            $table->increments('id');
            // Omitted fields...
            $table->smallInteger('pages')->default(0);

            $table->timestamps();
            $table->softDeletes();
        }
    );
}

当我尝试使用

保存实体时
$entity->save();

在我的控制器中,当字段值为空时,该特定列出现错误:

SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'pages' at row 1

我可以通过在模型中创建一个 mutator 来解决这个问题,如下所示:

public function setPagesAttribute($value)
{
    if (empty($value)) {
        $this->attributes['pages'] = 0;
    }
}

但无论如何,Laravel / Eloquent 不应该这样做吗?

我只是在想,我在这里做错了什么......

【问题讨论】:

  • 我假设您可以在架构中添加 ->nullable() 并尝试?
  • @petkostas "nullable" 不应在此处使用,因为他希望该值默认为 0。仅当列没有值有意义时才使用可空列,但 0 是更适合数字字段,这样他在使用该值时就不需要在代码中检查 NULL(取决于他希望代码做什么;null 可能是合适的)。
  • 我只在我的 Mac 上得到这个,当我们部署我们的代码时,它不会发生在我们的 Ubuntu 测试机器上。这似乎是 MySQL 配置问题。

标签: mysql laravel laravel-4 eloquent


【解决方案1】:

我在网上找到了一个解决方案:http://www.garethalexander.co.uk/tech/mysql-5-incorrect-integer-value-column-id-row-1

只需执行以下操作:

  • 编辑 my.cnf
  • 注释掉该行
    • sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • 然后运行 ​​$ mysql.server restart

【讨论】:

  • 您也应该修复代码。您的“默认值”根本没有被使用,并且您在技术上将一个 STRING (一个空的)传递到一个整数列中。您正在为可能导致意外行为的 SQL 表关闭相当多的错误检查:dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html
  • 这发生在我使用 Laravel 4.2 - Fedora 21 插入 NULL 值时,这里使用 MySQL 5.6。感谢您的发表! :)
【解决方案2】:

问题是一个空字符串被传递给 Pages 字段的查询(默认值只会在没有为该字段传递值的情况下触发)。我不确定您是如何构建实体对象的,但是当您希望它使用默认值时,基本上不应该设置实体->页面。

如果您通过 Input 变量获取页面,使用 Input::get('pages', 0) 或 Input::get('pages', null) 应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 2019-11-08
    相关资源
    最近更新 更多