与2张桌子相关的Laravel Eloquent关系

时间:2017-11-10 08:31:29

标签: php mysql laravel eloquent

我的数据库中有3个表。候选人,评委和分数。

现在,我想做什么来获取或查询或显示评委尚未评分的候选人。

在基本的php我们可以查询使用sql查询,如

select * from scores where candidateId='1' and judgeId='2'

任何人都可以帮我解决如何在Laravel Eloquent Relationship上做到这一点吗?

1 个答案:

答案 0 :(得分:2)

对于这个简单的查询,您不需要Eloquent Relationship,只需使用Model:

$scores = Score::where(['candidateId' => 1, 'judgeId' => 2])->get();

但是如果你想用关系来做,你必须首先在你的得分模型中定义关系:

class Score extends Model {
    protected $table = 'scores';
    public function candidate() {
        return $this->belongsTo(Candidate::class, 'candidateId');
    }
    public function judge() {
        return $this->belongsTo(Judge::class, 'judgeId');
    }
}

然后您可以查询关系:

$candidateId = 1;
$judgeId = 2;
$scores = Score::whereHas('candidate', function($query) use ($candidateId) {
    $query->where('id', $candidateId);
})->whereHas('judge', function ($query) use ($judgeId) {
    $query->where('id', $judgeId);
})->get();

更新#1: 如果您想获得每个考生的分数,您可以在您的候选人中定义关系:

class Candidate extends Model {
    protected $table = 'candidates';
    public function scores() {
        return $this->hasMany(Score::class, 'candidateId');
    }
}

然后找到候选人及其分数:

$candidate = Candidate::find(1);
$scores = $candidate->scores;

您可以将$ candidate传递给您的视图并在视图中获得分数,但不建议您在视图中进行查询。我的意思是不要在你的视图中调用Candidate :: find(1),但可以在视图内完成$ candidate->分数。