通过hasOneThrough关系更新记录



我正在尝试使用hasOneThrough关系更新或创建新记录。一个用户可以有多个答案,一个答案可以有一个条件答案。我可以使用User更新Answers关系,但我不知道如何通过AnswersUser关系更新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']]); 

我没有测试这个代码,但我想你已经明白了。

最新更新