Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在json编码之后,不再过滤Laravel筛选的集合_Laravel_Eloquent_Laravel Collection - Fatal编程技术网

在json编码之后,不再过滤Laravel筛选的集合

在json编码之后,不再过滤Laravel筛选的集合,laravel,eloquent,laravel-collection,Laravel,Eloquent,Laravel Collection,我有一个雄辩的收藏与一个渴望加载的关系。当我过滤这个急切加载的关系时,它工作得很好,但是如果我将其编码为JSON(将其传递给我的前端Javascript框架),集合就不再被过滤 简化示例: $questions = Question::with('variables')->get(); foreach($questions as $key => $q) { $questions[$key]->variables = $q->variables->reject(

我有一个雄辩的收藏与一个渴望加载的关系。当我过滤这个急切加载的关系时,它工作得很好,但是如果我将其编码为JSON(将其传递给我的前端Javascript框架),集合就不再被过滤

简化示例:

$questions = Question::with('variables')->get();

foreach($questions as $key => $q) {
  $questions[$key]->variables = $q->variables->reject(function($v) {
    return $v->type == 3;
  });
}

dd($questions);
如果此时查看$questions变量,则我的集合已正确过滤。但是,如果我在转储之前在下面一行添加
json\u decode(json\u encode($questions))
,则集合将不再被过滤

请注意,在我的实际应用程序中,在将被拒绝的变量抛出集合之前,我必须对它们进行一些处理,因此我不能在查询期间简单地将它们过滤掉

我现在的解决方法是对集合进行json编码和解码,然后执行数组过滤器以去除我不想传递到前端的变量。这是可行的,但似乎是一个非常不雅观和不必要的解决方案。我是做错了什么,还是这是预期的行为


如果新版本上的行为发生了变化,我仍然在此应用程序上运行Laravel 5.8。

为什么不加载两次变量呢

$questions=Question::with(['variables'=>fn($v)=>$v->where('type','!=',3)]->get();
//对过滤后的集合执行任何需要执行的操作
//重新加载变量关系
$questions->load('variables');
//对问题及其所有变量做任何你需要做的事情。
您可以试试

$questionsWithFilteredVariables=$questions->map(函数($question){
$variables=$question->variables->reject(fn($var)=>$var->type==3);
未设置($问题->变量);
$question->variables=$variables;
返回$问题;
});
//现在进行json_解码(json_encode(…),它仍将包含过滤的变量
$questionsWithFilteredVariables=json\u解码(
json_编码($questionsWithFilteredVariables)
);

在您的代码中,
$questions
是单个模型,而不是集合。这是一个错误;我本来打算写get(),现在我已经编辑了。。问题的关键是筛选嵌套集合,这在查询时无法完成,因为在筛选出这些变量之前,需要出于其他原因使用这些变量。感谢您的回答。我在最初的问题中犯了一个错误;我应该在查询中列出get()而不是find()。正如我在问题中提到的,我无法在查询过程中进行筛选,因为我需要使用类型为3的变量进行一些计算,然后返回不带它们的集合(简化示例中未显示)。加载两次变量怎么样?你甚至可以让它们变成不同的变量@IGP答案是正确的。但是可能需要一些改变,因为我们需要过滤
type=3
$v->where('type','!=',3)