用 Eloquent 过滤

filter with Eloquent

我有 2 个表:测试、问题,我想显示测试的激活问题:

$test = Test::whereHas('questions', function(Builder $query){
            $query->where('activated','=','1');
        })->find($id);

但我得到了问题;激活和停用。

谢谢你的帮助。

您正在获取所有已激活问题的测试。

但是当获得结果 $test 时,您可能正在获取 all 个具有 $test->questions.

关系的问题

如果你只想获取激活的问题,你可以在 $test 对象上执行以下操作:

$test = Test::whereHas('questions', function(Builder $query){
            $query->where('activated','=','1');
        })->find($id);

$questions = $test->questions()->where('activated', '1')->get();

急切加载已激活的问题:

$test = Test::whereHas('questions', function(Builder $query){
            $query->where('activated','=','1');
        })->with(['questions' => function ($query) {
    $query->where('activated', '1');
}])->find($id);

// Will only give you the activated questions
var_dump($test->questions);

或者您可以在测试模型中定义自定义关系,它会为您进行过滤。

当您使用 whereHas 时,您是在告诉 eloquent 仅 select 测试至少有一个激活的问题。但是您并没有告诉它只保留已激活的问题:您可以使用 constrained eager loading:

来实现
$test = Test::with(['questions' => function(Builder $query){
            $query->where('activated','=','1');
        }])->find($id);