我正在尝试使用 hasOneThrough
关系更新或创建新记录。一个用户可以有多个答案,一个答案可以有一个条件答案。我可以使用 Answers
更新 User
关系,但我不知道如何通过 ConditionalAnswers
Answers
关系更新 User
?
错误
Call to undefined method Illuminate\Database\Eloquent\Relations\HasMany::conditionalAnswers()
用户
id
答案
id
user_id
conditional_answers
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
答案 0 :(得分:0)
尝试这样的事情:
$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
);
}
答案 1 :(得分:0)
由于每个 conditionalAnswer 都遵循一个答案,因此您可以像这样将 conditionalAnswer 添加到控制器中的答案中:
$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);
答案 2 :(得分:0)
在这部分代码中,您需要指定需要创建基础或相关的答案。
$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']]);
我没有测试这段代码,但我想你明白了。