このエラーが発生しており、チェックしたグーグルの結果はどれも私の問題に似ていません。
クラスDeal、User、Matchesのアプリケーションがあります
取引には多くの一致があります。ユーザーには多くの一致があります。ユーザーには多くの取引があります。
Dealオブジェクトを使用して新しい試合を作成しようとしています
$deal->matches()->create(['user_id'=>$id]);
これは私のマッチクラスです。必要な関係をすべて定義しました
class Match extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $guarded = [];
public $timestamps = false;
public $expired_on = "";
public static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->matched_on = $model->freshTimestamp();
});
}
public function __construct(){
$d = (new \DateTime($this->matched_on))->modify('+1 day');
$this->expired_on = $d->format('Y-m-d H:i:s');
}
/**
* Get the user that owns the match.
*/
public function user()
{
return $this->belongsTo('App\User');
}
/**
* Get the deal that owns the match.
*/
public function deal()
{
return $this->belongsTo('App\Deal');
}
}
そして、新しいマッチを作成しようとすると、このエラーが発生し続けます。
Connection.php行647のQueryException:SQLSTATE [HY000]:一般エラー:1364フィールド 'user_id'にはデフォルト値がありません(SQL:
matches
(deal_id
)の値に挿入(1))
私は空の配列であると警戒していますが、何が問題なのでしょうか?
guarded
配列を削除し、代わりにfillable
を追加します。
protected $fillable = ['user_id', 'deal_id'];
以前の動作に戻したい場合は、
config/database.php
ファイルに接続し、接続用に'strict' => false
を設定します。
私の場合、これは一意のフィールドであったため、nullにすることはできませんでした。
私にとっては、空のコンストラクターが原因で問題が発生する原因がわかりませんでした。理由を知っている人はコメントしてください。
public function __construct(){
}
コメント/削除して問題を解決しました。
Alexey Mezenin's答えは正しいものであり、正しいものです。
保護された空の配列を維持したい人のために私がそれを使った別の方法は、新しいMatchオブジェクトを作成し、属性を入れて保存することです。
$match->user_id = $id;
$match->deal_id = $deal->id;
$match->matched_on = $match->freshTimestamp();
$match->save();