【问题标题】:Laravel hasMany error. 'site_id' doesn't have a default valueLaravel 有很多错误。 “site_id”没有默认值
【发布时间】:2019-02-05 10:27:18
【问题描述】:

我在控制器中有以下方法

public function store(Request $request)
{
    $site = Site::create([
        "path" => $request->path,
        "site_link" => $request->link,
    ]);

    if ($request->features) {
        $features = explode(',', $request->features);

        foreach ($features as $feature) {
            $site->features()->save(SiteFeature::create(["feature" => $feature]));
        }
    }

    return response()->json($site, 201);
}

站点模型有这个方法

public function features()
{
    return $this->hasMany('App\SiteFeature');
}

这是我 $fillableSiteFeature 属性

protected $fillable = ['feature', 'site_id'];

由于某种原因,我得到下一个错误

local.ERROR: SQLSTATE[HY000]: 一般错误: 1364 Field 'site_id' 没有默认值(SQL:插入site_features (feature) 值 (fes)) {"exception":"[object] (照亮\数据库\查询异常(代码:HY000):SQLSTATE[HY000]: 一般错误:1364 字段 'site_id' 没有默认值(SQL: 插入site_featuresfeature)值(fes))

【问题讨论】:

  • 您正在添加一行,但 site_id 没有要插入的值,在数据库架构中也没有默认值,因此 INSERT 失败。
  • 你不能放两个模型吗?
  • 您正在使用此protected $fillable = ['feature', 'site_id'];,因此您需要为site_id 提供值,否则请更改表格并为列site_id 添加默认值

标签: php mysql laravel dingo-api


【解决方案1】:

Model::create 方法实际上在您的数据库中创建了一条记录,并且由于您没有指定必需的 site_id,因此它失败了,这就是您看到此错误的原因。

看起来您正在尝试使用 Laravel 的关系为该站点保存一个新的 SiteFeature,但是您将一个已经存在的对象(如果查询没有失败)传递给关系的 @987654326 @方法。

您需要将尚未保存到数据库的SiteFeature 实例传递给save 方法:

$this->features()->save(new SiteFeature(['feature' => $feature]));

或者你可以使用关系的create 方法来避免完全传入一个实例,你只需要提供属性:

$this->features()->create(['feature' => $feature]);

【讨论】:

  • $site->create() 应该创建一个 hasMany 关系记录,因此它应该提供 site_id 本身
  • 在这种情况下,您没有使用关系来创建实体,我将更新我的答案。
  • 问题是我试图使用 eloquent 为站点功能创建数据库记录,而不是创建模型实例。
【解决方案2】:

试试这个

在你的模型中features

public function features()
{
  return $this->hasMany('App\SiteFeature','site_id','id');
}

你的模特SiteFeature

public function siteFeatures()
{
  return $this->belongsTo('App\features', 'site_id', 'id');
}

【讨论】:

    【解决方案3】:
    $site = Site::create([
        "path" => $request->path,
        "site_link" => $request->link,
    ]);
    

    不返回最后一个插入 id...尝试

    $site = new Site;
    $site->path = $request->path;
    $site->site_link = $request->link;
    $site->save();
    

    至于这部分:

    if ($request->features) {
        $features = explode(',', $request->features);
    
        foreach ($features as $feature) {
            $site->features()->save(SiteFeature::create(["feature" => $feature]));
        }
    }
    

    如果上面的代码不起作用,你可以这样做......

    if ($request->features) {
        $features = explode(',', $request->features);
    
        foreach ($features as $feature) {
            $sf = new SiteFeature;
            $sf->feature = $feature;
            $sf->site_id = $site->id;
            $sf->save();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      相关资源
      最近更新 更多