用 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);
我有 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);