通过 hasOneThrough 关系更新记录

时间:2021-03-21 18:03:21

标签: laravel eloquent

我正在尝试使用 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

3 个答案:

答案 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);

您可以阅读文档Inserting & Updating Related Models

答案 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']]); 

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