如何在laravel中将INT字段保存为null

如何在laravel中将INT字段保存为null,laravel,Laravel,保存一些空文本、文本区域字段时出错。Laravel形成此sql查询: SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'inside_area' at row 1 (SQL: insert into `ads` (`street`, `quarter`, `building_number`, `inside_area`, `price`, `admin_comment`, `valid_to`

保存一些空文本、文本区域字段时出错。Laravel形成此sql查询:

SQLSTATE[HY000]: General error: 1366 Incorrect integer value: '' for column 'inside_area' at row 1 (SQL: insert into `ads` (`street`, `quarter`, `building_number`, `inside_area`, `price`, `admin_comment`, `valid_to`, `price_heating`, `rooms`, `floor_number`, `floors_number`, `kitchen_area`, `years`, `public_comment`, `video_url`, `3d_url`, `user_id`, `updated_at`, `created_at`) values (, , , , , , , , , , , , , , , , 1, 2017-03-13 14:33:50, 2017-03-13 14:33:50))
p.S.db表不是以laravel的方式创建的-我正在使用现有的表,这可能很重要

更新:问题仅限于INT字段,如果保存时表单字段为空

表:

CREATE TABLE `ads` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `ad_type_id` int(11) DEFAULT NULL,
  `city_id` int(11) DEFAULT NULL,
  `street` varchar(255) DEFAULT NULL,
  `quarter` varchar(255) DEFAULT NULL,
  `building_number` varchar(255) DEFAULT NULL,
  `inside_area` int(11) DEFAULT NULL,
  `price` int(11) DEFAULT NULL,
  `show_price_per_meter` int(1) DEFAULT NULL,
  `price_heating` int(10) DEFAULT NULL,
  `admin_comment` text,
  `valid_to` datetime DEFAULT NULL,
  `rooms` int(11) DEFAULT NULL,
  `floor_number` int(11) DEFAULT NULL,
  `floors_number` int(11) DEFAULT NULL,
  `kitchen_area` int(11) DEFAULT NULL,
  `balcony` int(1) DEFAULT NULL,
  `balcony_glazed` int(1) DEFAULT NULL,
  `years` int(11) DEFAULT NULL,
  `dyn_house_type_id` int(11) DEFAULT NULL,
  `dyn_heating_id` int(11) DEFAULT NULL,
  `dyn_installation_ids` int(11) DEFAULT NULL,
  `public_comment` text,
  `video_url` varchar(11) DEFAULT NULL,
  `3d_url` varchar(11) DEFAULT NULL,
  `available_for_trade` int(1) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
表格:

路线:

Route::resource('ads', 'AdsController');
保存操作:

public function store() {
        $input = Request::all();
        \App\Ad::create($input);
        return redirect('/ads/my_index');
    }

p.S.2如果我向
inside\u area
字段提供任何值,它将正常运行,下一个错误是
price
字段。

也许,您正在将字符串数据传递给“inside\u area”变量。因为您的表中有更多默认的空字段,例如“city\u id”、“ad\u type\u id”

您可以对每个整数属性使用属性mutator。在这些变体中,您可以在插入数据库之前准备数据

在您的情况下,您应该在模型广告中为INT类型的每个字段创建变体:

// define a mutator for the field "inside_area"
public function setInsideAreaAttribute($value)
{
    $this->attributes['inside_area'] = (int) $value;
}
我知道为每个INT字段创建这样一个mutator是很无聊的,但它也可以让您在插入数据库之前控制用户输入

您可以在此处找到关于突变子的更多信息(目前最新版本的Laravel):

  • Laravel 5.4,定义了一个突变子:

另一种方法是使用
Iatstuti
并在Ad.php模型中提供:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Iatstuti\Database\Support\NullableFields;

class Ad extends Model {

    use NullableFields;

    public $timestamps = true;

    protected $nullable = [
        'inside_area'
    ];

    protected $fillable = [
        'user_id',
        'ad_type_id',
        'inside_area'


    ];

}

您可以添加生成Laravel查询的代码吗?也许您需要将{inside_area}值作为整数插入?(例如intval(内部区域))。您放置在那里的{inside_area}的值的数据类型可能有些问题。我已经添加了更多关于这种情况的代码。如果我为
inside\u area
字段提供数值,它会正常运行,但第二个INT字段的错误是空值。我忘了提到,有些表字段没有表单字段。因此,
in_区域
是第一个包含表单字段的INT字段,保存时为空。我为
城市id
创建了一个字段,所以如果它是空的,我也会在上面得到错误。
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Iatstuti\Database\Support\NullableFields;

class Ad extends Model {

    use NullableFields;

    public $timestamps = true;

    protected $nullable = [
        'inside_area'
    ];

    protected $fillable = [
        'user_id',
        'ad_type_id',
        'inside_area'


    ];

}