当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩-或在哪里有方法-何时使用它以及如何使用

贺宝
2023-03-14

我试图理解一些高级的雄辩命令,在Laravel官方文档中,没有太多关于雄辩或Wherehas方法的内容,也没有关于它如何工作的示例
https://laravel.com/docs/8.x/eloquent-relationships#querying-关系存在

有人能帮我理解一下吗?还有一个简单的例子。

共有2个答案

姜松
2023-03-14

比如说有一个类似博客的应用程序。应用程序的主要实体/模型是Post(博客文章)。

当任何作者撰写和发表文章时,

  • 博客网站的访问者可以对文章发表评论

我们这里有3个模型

  • 帖子-可以有很多评论
  • Post-可以有许多相似项

现在让我们假设出于某种原因,我们想要从数据库中获取所有Post记录,这些记录要么在当前月份有10条或更多的评论,要么在当前月份有3条或更多的赞

我们可以写一个查询比如

php prettyprint-override">$posts = Post::whereHas('comments', function($query) {
        $query->where('created_at', '>', now()->startOfMonth();
    }, '>=', 10)
    ->orWhereHas('likes', function($query){
        $query->where('created_at', '> ', now()->startOfMonth();
    }, '>=', 3)
    ->get();

Laravel文件:https://laravel.com/docs/8.x/eloquent-relationships#querying-关系存在

就像where一样,whereHasorWhereHas都接受闭包作为第二个参数,以实现更细粒度的查询控制。

实际上,当您希望对约束有更多的能力时,应该使用where

如果您只想检查是否存在关系记录,您可以使用has进行以下操作:

获取所有有评论或类似评论的帖子记录,每页分页20页

$postsWithCommentsOrLikes = Post::has('comments')
    ->orHas('likes')
    ->paginate(20);
百里景山
2023-03-14

如何使用它:只是链作为任何其他雄辩方法

User::whereHas(...)->orWhereHas(...)->get();

何时使用:假设您有用户帖子评论,每个用户都可以写帖子和评论。然后你需要获得活跃的用户。例如,您假设活动用户在过去7天内发表了帖子或评论。因此,您可以通过以下方式获得:

$users = App\Models\User::query()
    ->whereHas('posts', function (Builder $query) {
        $query->where('created_at', '>=', Carbon::now()->subDays(7));
    })
    ->orWhereHas('comments', function (Builder $query) {
        $query->where('created_at', '>=', Carbon::now()->subDays(7));
    })
    ->get();
 类似资料:
  • 我的客户通过订单订购了许多包裹。 我想退回包裹数量超过0且状态仅为成功的客户。但我不知道如何添加包裹状态的条件。目前,这份声明给了我一份有包裹的客户名单<代码>$customers=Customer::has('包裹','

  • 如何将以下查询转换为Laravel4雄辩ORM?

  • 我正在努力使用laravel函数 我的代码在这里: 存储时:公司存储良好,但对于公司人员,它将存储到 Larave Documentations说: 有时,您可能不仅希望保存模型,还希望保存其所有关系。为此,您可以使用推送方法: 怎么了?

  • 问题内容: 我是Angular 4的新手,所以谁能解释在Angular 4中的使用方式和位置? 实际上,我想从父组件覆盖子组件的某些CSS属性。此外,它在IE11上受支持吗? 问题答案: 通常, 可使用组合器将样式强制降低到 。这个选择器有一个别名>>>,现在还有另一个叫做:: ng-deep的别名。 由于 已弃用,建议使用 例如: 和 它将应用于子组件

  • 问题内容: 我正在阅读一些有关Java中异常处理的内容,以便能够编写更好的代码。好吧,我承认,我有罪。我使用了太多try-catch {}块,在捕获中使用了它,甚至没有使用适当的记录器(实际上是和被重定向到,因此生成了日志)。但是,经过几个小时的阅读,我发现自己在一个陌生的地方:未知。如果异常被设计为传递有关异常流状态的信息,那么人们如何知道WHERE是使用该信息执行操作的适当级别? 例如,当发生

  • 始终使用Laravel Elotent而不是原始SQL有什么好处吗? 我有一个习惯,首先在phpMyAdmin中编写SQL来检查关系,然后将其翻译成雄辩的ORM。 有时,翻译成雄辩的ORM是痛苦和耗时的,尤其是从长而复杂的SQL查询进行翻译。与使用雄辩的ORM相比,我能够用SQL快速编写。