当前位置: 首页 > 面试题库 >

在Laravel 5中合并'with'和'whereHas'

花玄裳
2023-03-14
问题内容

我在Laravel 5中使用Eloquent编写了此代码,该代码运行良好:

$filterTask = function($query) use ($id) {
    $query->where('taskid', $id);
};

User::whereHas('submissions', $filterTask)->with(['submissions' => $filterTask])->get();

基本上,目标是仅让那些过滤了提交内容的用户拥有其中的任何一个。但是,似乎浪费了在 whereHas带有
相同回调函数的方法上运行的时间。有没有一种方法可以简化它?

谢谢。


问题答案:

在性能方面,您实际上无法在此进行任何优化(除非您要从雄辩的关系转向联接)。有或没有whereHas,将运行两个查询。一个选择所有用户,另一个选择加载相关模型。当您添加whereHas条件时,将添加一个子查询,但是仍然是两个查询。

但是,从语法上讲,您可以通过向模型(甚至是基础模型,如果您想更频繁地使用它)添加查询范围来对此进行一点优化:

public function scopeWithAndWhereHas($query, $relation, $constraint){
    return $query->whereHas($relation, $constraint)
                 ->with([$relation => $constraint]);
}

用法:

User::withAndWhereHas('submissions', function($query) use ($id){
    $query->where('taskid', $id);
})->get();


 类似资料:
  •  创造不息,交付不止 Introduction A quick reference guide (cheat sheet) for Laravel 5.1 LTS, listing artisan, composer, routes and other useful bits of information. We intend to build this Cheat Sheet more asse

  • 问题内容: 我有一个带有4列的(example-)数据框: 我现在想将B,C和D列合并/合并到新的E列,如本例所示: 我在这里发现了一个非常类似的问题,但这在A列的末尾添加了合并的列B,C和D: 感谢帮助。 问题答案: 选项1 使用和 选项2 使用分配和 选项3 最近,我喜欢第3个选项。 使用

  • 这些是家庭作业问题,但我想了解它们背后的概念,而不仅仅是得到答案。 我知道MergeSort的运行时间是O(nlogn)。似乎合并方法必须运行 n 次(因为它必须合并所有数组,最终会有 n 个数组)。因此,我想我可以推断出 MergeSort() 方法将被称为 logn times。我也认为这是有道理的,因为它正在划分数组,所以它会一直将自己除以 2,所以 logn。 因此,我觉得答案分别是C和A

  • 问题内容: 在开始之前,请允许我承认存在类似的问题,有些有答案,有些没有。但是,它们不能解决我的特定问题。如果您知道任何信息,请转给我。 现在,当我将图片添加到时,我将图片放置在光标所在的位置。我通过每次添加5个空格来为图像腾出空间来实现此目的。光标移到的末尾时,除非我键入一个键,否则它将停留在该位置而不会自动移动到下一行。即使我添加空格,它也仍然停留在那里,因此我的图像只是堆积在那里。我决定添加

  • Laravel 5 Bundles-Modules Bundles-Modules 是一个把应用分成多个包,一个包分成若干个小模块。 这是 laravel5 框架的 bundle 包系统,每个 bundle 都 module 模块化,模块与模块之前互不影响,全新开发目录,适合团队开发,松耦合,可以抛弃自带的 APP 目录了,使用全新的开发目录结构/,使开发变得更简单。 开发目录结构: bundle

  • 问题内容: 这里有些错误,似乎无法合并XML DOMDocumet,这是我收到的错误,“致命错误:在第27行的C:\ xampp \ htdocs \ xmltest\ xmltest.php中调用未定义的方法DOMElement :: importNode()”可以任何人都可以帮助我正确编写此代码… 问题答案: 是属于文档的方法,而不是元素。您要导入 文档 (),然后追加到 元素 ()。 导入时