在laravel中保存多个外键
我的情况如下: 在我的控制器中,我需要保存两个外键:在laravel中保存多个外键,laravel,eloquent,Laravel,Eloquent,我的情况如下: 在我的控制器中,我需要保存两个外键:exam\u id和category\u id,但总是说: SQLSTATE[HY000]:一般错误:1364字段“检查id”没有默认值 背景: 考试有问题(考试有很多问题,但问题属于考试)。问题也属于范畴,范畴有很多问题。在模型中看起来像 类别 class Category extends Model{ protected $fillable = [ 'name' ]; public func
exam\u id
和category\u id
,但总是说:
SQLSTATE[HY000]:一般错误:1364字段“检查id”没有默认值
背景:
考试有问题(考试有很多问题,但问题属于考试)。问题也属于范畴,范畴有很多问题。在模型中看起来像
类别
class Category extends Model{
protected $fillable = [
'name'
];
public function questions(){
return $this->hasMany(Question::class);
}
}
考试
class Exam extends Model{
protected $fillable = [
'user_id', 'title', 'description', 'score'
];
protected $guarded = [];
public function user(){
return $this->belongsTo(User::class);
}
public function questions(){
return $this->hasMany(Question::class);
}
}
问题
class Question extends Model{
protected $fillable = [
'exam_id', 'category_id' ,'description', 'iframe', 'image',
];
protected $guarded = [];
public function exam(){
return $this->belongsTo(Exam::class, 'exam_id');
}
public function category(){
return $this->belongsTo(Category::class);
}
}
问题控制员
public function store(QuestionStoreRequest $request){
$questions = Question::create($request->all());
$questions->exam()->attach($request->get('exam_id'));
$questions->category()->attach($request->get('category_id'));
$questions->save();
return view('question.create');
}
当我尝试在存储方法上保存时,从不插入字段exam\u id
和idk为什么?如何保存多个外键
更新1:
我添加了如何声明我的表(和关系)
当我插入一个问题时,这个问题会插入考试id
我想做的是,当我插入问题时,它应该使用它所属考试的id。我不知道这是应该保存在问题控制器中还是应该保存在考试控制器中
更新3:
dd()输出:
更新4
问题表(获取类别id)
@CSRF
描述普雷孔塔酒店*
{{old('description')}
描述一下你的生活。
视频协会*
{{old('iframe')}
视频插页。
阿索西亚图像酒店
狭义的分类
@foreach($category作为$category)
{{$category->name}
@endforeach
Elige una categoria。
瓜达尔普雷孔塔酒店
为什么不使用直接属性
public function store(QuestionStoreRequest $request){
$questions =new Question();
$questions->description=$request->get('description');
$questions->iframe=$request->get('iframe');
$questions->image=$request->get('image');
$questions->exam_id=$request->get('exam_id');
$questions->category_id=$request->get('category_id');
$questions->save();
return view('question.create');
}
这样,您只需访问一次数据库,而不是三次。
attach()
方法适用于多对多关系(通过belongtomany()
)。您的任何关系都不使用此逻辑…当使用associate()时,会出现相同的错误,例如:$questions->exam()->associate('exam\u id)代码>我认为你根本不需要这样称呼它<代码>问题::create()
将通过这些列自动关联到考试和类别。删除附加通话和保存通话,看看是否有效。好的,我正在尝试你的评论。很好!但是您可以看到缺少考试id
和类别id
字段。这些数据来自哪里?还有HTML表单?还有Ajax请求?在这个过程中的某个地方,您缺少了这些字段,如果这些字段从未进入数据库,您将无法将null
保存到这些列中。您是对的,我已将我的答案编辑得更清楚这是一种更详细的方法(完全可以接受),但我认为Question::create($request->all())代码>,删除附加逻辑(包括保存等)会很好:)我使用你的答案,但我有一个新错误(是的!)SQLSTATE[23000]:完整性约束冲突:1048列“exam\u id”不能为null
为什么?@Edgar Gc这意味着$request->get('exam\u id')是空的null@OMR哈哈,是的,无需担心:)如果test\u id
是null
来自$request
,这与语法首选项是完全不同的问题,所以最好将其分开。
array:4 [▼
"_token" => "ec4qvPN6hySporQUvZrnAIqkmZEOCvAMLFAUQB6q"
"description" => "igdiysagdfyud"
"iframe" => "iysgdfygsdyufgsdf"
"category" => "3"
]
<form action="/questions" method="POST" enctype="multipart/form-data">
@CSRF
<div class="form-group">
<label for="description">Descripcion de la pregunta*</label>
<textarea name="description" type="text"
class="form-control" id="description"
aria-describedby="descriptionHelp"
placeholder="Inserte la pregunta">{{ old('description') }}</textarea>
<small id="descriptionHelp"
class="form-text text-muted">Escribe la descripcion de la pregunta.</small>
</div>
<div class="form-group">
<label for="iframe">Video asociado *</label>
<textarea name="iframe" type="text"
class="form-control" id="iframe"
aria-describedby="iframeHelp"
placeholder="Inserte la URL del video">{{ old('iframe') }}</textarea>
<small id="iframeHelp" class="form-text text-muted">Inserta la url del video.</small>
</div>
<div class="form-group d-flex flex-column">
<label for="image">Imagen asociada</label>
<input name="image" type="file" class="py-1">
</div>
<div class="form-group">
<label for="category">A que categoria pertenece</label>
<select name="category" class="form-control form-control-lg" id="category">
@foreach($category as $category)
<option value="{{ $category->id }}">{{ $category->name }}</option>
@endforeach
</select>
<small id="selectHelp" class="form-text text-muted">Elige una categoria.</small>
</div>
<hr />
<button type="submit" class="btn btn-primary">Guardar pregunta</button>
</form>
public function store(QuestionStoreRequest $request){
$questions =new Question();
$questions->description=$request->get('description');
$questions->iframe=$request->get('iframe');
$questions->image=$request->get('image');
$questions->exam_id=$request->get('exam_id');
$questions->category_id=$request->get('category_id');
$questions->save();
return view('question.create');
}