我正在尝试使用hasOneThrough
关系更新或创建新记录。一个用户可以有多个答案,一个答案可以有一个条件答案。我可以使用User
更新Answers
关系,但我不知道如何通过Answers
User
关系更新ConditionalAnswers
?
错误
Call to undefined method IlluminateDatabaseEloquentRelationsHasMany::conditionalAnswers()
用户
id
回答
id
user_id
条件_回答
id
answers_id
用户
public function answers(){
return $this->hasMany(Answers::class);
}
public function conditionalAnswers() {
return $this->hasManyThrough(ConditionalAnswers::class, Answers::class);
}
回答
public function user(){
return $this->belongsTo(User::class);
}
public function conditionalAnswers() {
return $this->hasOne(ConditionalAnswers::class);
}
条件答案
public function user() {
return $this->hasOneThrough(Answers::class, User::class);
}
public function answers() {
return $this->belongsTo(Answers::class);
}
控制器
$input = $request->all();
$user = User::find($input['user_id']);
$answers = $user->answers()->updateOrCreate(['user_id' => $user->id, 'key' => 'temp'], $input['answers']); // works fine
$conditionalAnswers = $user->answers()->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]); // doesnt work
试试这样的东西:
$input = $request->all();
$user = User::find($input['user_id']);
$answers = $user->answers()->updateOrCreate(['user_id' => $user->id, 'key' => 'temp'], $input['answers']); // works fine
// $conditionalAnswers = $user->answers()->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]); // doesnt work
$conditionalAnswers = collect();
foreach ($user->answers as $answer) {
$conditionalAnswers = $conditionalAnswers->merge(
$answer
->conditionalAnswers()
->updateOrCreate(
['answers_id' => $answers->id, 'key' => 'temp_days'],
['value' => $input['conditional_answers']]
) // should work
);
}
由于每个conditionalAnswer都遵循一个答案,因此您可以将conditionalAnswer添加到控制器中的answer中,如下所示:
$input = $request->all();
$user = User::find($input['user_id']);
$answers = $user->answers()->updateOrCreate(['user_id' => $user->id, 'key' => 'temp'], $input['answers']);
$conditionalAnswers = $answers->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]);
或者你可以试试:
$conditionalAnswers = new ConditionalAnswers(['key' => 'temp_days'], ['value' => $input['conditional_answers']]);
$answers->conditionalAnswers()->save($conditionalAnswers);
您可以阅读文档Inserting&更新相关模型
在代码的这一部分中,你需要指定哪个答案需要在.上创建基础或相关
$conditionalAnswers = $user->answers()->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]); // doesnt work
像这个
$conditionalAnswers = $user->answers()->find(id)->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]); // replace id in find method
或者像这样使用创建的答案对象。
$answers = $user->answers()->updateOrCreate(['user_id' => $user->id, 'key' => 'temp'], $input['answers']); // works fine
$conditionalAnswers = $answers->conditionalAnswers()->updateOrCreate(['answers_id' => $answers->id, 'key' => 'temp_days'], ['value' => $input['conditional_answers']]);
我没有测试这个代码,但我想你已经明白了。