尝试在Laravel中获取子模型时,模型关系不起作用

qojgxg4l  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个模型Question属于模型ExamExam可以有许多问题(一对多关系)。存储数据没有问题,但是当我尝试用Exam::find($exam->id)->questions;获取考试的问题时,我得到的是NULL。我有dd的结果为Exam::find($exam->id)和关系是空的:#relations: []
以下是我注册Question模型的方式:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Question extends Model
{

    public $timestamps  = false;
    protected $fillable = ['question', 'correct_answer', 'category_id', 'type'];

    public function questionCategory():belongsTo {
        return $this->belongsTo(QuestionCategory::class);
    }

    public function exam(): BelongsTo {
        return $this->belongsTo(Exam::class);
    }
}

以下是Exam模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Exam extends Model
{
    public $timestamps = false;
    protected $fillable = ['name'];

    public function question(): HasMany
    {
        return $this->hasMany(Question::class);
    }
}

下面是迁移文件中问题表的DB模式:

Schema::create('questions', static function (Blueprint $table) {
            $table->id();
            $table->string('question');
            $table->integer('correct_answer')->nullable();
            $table->integer('question_category_id')->default(1);
            $table->integer('exam_id');
            $table->string('type')->default('text');
        });

这也是我如何保存问题的数据:

$request->validate([
    'examId' => ['required', 'numeric'],
    'questions' => 'required'
]);

$exam = Exam::find($request->input('examId'));
$questions = $request->input('questions');

foreach ($questions as &$question_entry) {
    // create the question if it doesn't exist
    if ((int)$question_entry['id'] === 0) {
        $question = new Question();
    } else {
        $question = Question::find($question_entry['id']);
    }

    $question->exam_id = $exam->id;
    $question->question = $question_entry['body'];
    $question->type = $question_entry['type'];
    $question->question_category_id = $question_entry['category'];
    $question->save();     
}

保存到数据库是成功的,我可以看到数据库中的条目。如果我尝试做一些像Question::where('exam_id',1)->get()的事情,我会从考试中得到问题,但我不明白为什么当我尝试从父模型中得到结果时(比如Exam::find(1)->questions) I get NULL`)。似乎这两种模式之间没有任何关系。
我正在使用Laravel 10与宅基地和Breeze。

4smxwvx5

4smxwvx51#

Exam模型的关系定义中使用了单数question。这可能就是为什么它是空的原因。
你是否也尝试了复数questions,像这样:

public function questions(): HasMany
{
    return $this->hasMany(Question::class);
}

其余的代码看起来很好,但你也可以像这样创建外部id:

$table->foreignId('exam_id');

您可以在文档中阅读有关外键的更多信息

相关问题