企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### [](https://octobercms.com/docs/database/relations#querying-relations)查询关系 由于可以通过函数调用所有类型的Model关系,因此您可以调用这些函数来获取关系的实例,而无需实际执行关系查询。此外,所有类型的关系还可以用作[查询构建器](https://octobercms.com/docs/database/query),使您可以继续将约束链链接到关系查询上,最后对数据库执行SQL。 例如,想象一个博客系统,其中一个`User`模型具有许多关联的`Post`模型: ~~~ class User extends Model { public $hasMany = [ 'posts' => ['Acme\Blog\Models\Post'] ]; } ~~~ ### [](https://octobercms.com/docs/database/relations#querying-method)通过关系方法访问 您可以使用方法查询**职位**关系,并向关系中添加其他约束`posts`。这使您能够在关系上链接任何[查询构建器](https://octobercms.com/docs/database/query)方法。 ~~~ $user = User::find(1); $posts = $user->posts()->where('is_active', 1)->get(); $post = $user->posts()->first(); ~~~ ### [](https://octobercms.com/docs/database/relations#querying-dynamic-property)通过动态属性访问 如果不需要向关系查询添加其他约束,则可以简单地访问该关系,就好像它是一个属性一样。例如,继续使用我们的`User`和`Post`示例模型,我们可以`$user->posts`改为使用属性访问用户的所有帖子。 ~~~ $user = User::find(1); foreach ($user->posts as $post) { // ... } ~~~ 动态属性是“延迟加载”,这意味着它们仅在您实际访问它们时才加载其关系数据。因此,开发人员经常使用[急切的加载](https://octobercms.com/docs/database/relations#eager-loading)来预加载他们知道在加载模型后将对其进行访问的关系。预先加载大大减少了必须执行的SQL查询才能加载模型的关系。 ### [](https://octobercms.com/docs/database/relations#querying-existence)查询关系存在 访问模型的记录时,您可能希望根据关系的存在来限制结果。例如,假设您要检索所有具有至少一条评论的博客文章。为此,您可以将关系的名称传递给`has`方法: ~~~ // Retrieve all posts that have at least one comment... $posts = Post::has('comments')->get(); ~~~ 您还可以指定一个运算符并计数以进一步自定义查询: ~~~ // Retrieve all posts that have three or more comments... $posts = Post::has('comments', '>=', 3)->get(); ~~~ 嵌套`has`语句也可以使用“点”符号构造。例如,您可以检索所有具有至少一项评论和投票的帖子: ~~~ // Retrieve all posts that have at least one comment with votes... $posts = Post::has('comments.votes')->get(); ~~~ 如果您需要更大的功能,可以使用`whereHas`和`orWhereHas`方法在`has`查询中放置“ where”条件。这些方法使您可以向关系约束中添加自定义约束,例如检查注释的内容: ~~~ // Retrieve all posts with at least one comment containing words like foo% $posts = Post::whereHas('comments', function ($query) { $query->where('content', 'like', 'foo%'); })->get(); ~~~