You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在nuwave/lighthouse与Laravel中为对象类型Eloquent关联添加where条件

解决方案

方案1:使用字段解析器(适合复杂逻辑场景)

  • 首先在Page类型的subpages字段上添加@field指令,指定专属解析器
type Page {
    id: ID!
    name: String!
    slug: String!
    active: Boolean
    subpages: [Page!] @field(resolver: "App\\GraphQL\\Resolvers\\PageSubpagesResolver")
    created_at: DateTime!
    updated_at: DateTime!
}
  • 新建对应的解析器类,在解析方法中添加需要的查询条件
<?php

namespace App\GraphQL\Resolvers;

class PageSubpagesResolver
{
    public function __invoke(\App\Models\Page $page)
    {
        // 此处可自定义任意查询条件,完全不影响模型原有关联的使用
        return $page->subpages()
            ->whereNull('deleted_at')
            ->where('active', 1)
            ->get();
    }
}

方案2:使用@hasMany指令绑定本地作用域(性能更优,推荐简单过滤场景)

这个方案可以利用Lighthouse自带的关联预加载优化,避免N+1查询问题:

  • 首先在Page模型中添加专属的本地作用域方法
// App\Models\Page.php
public function scopeGraphQLSubpagesFilter($query)
{
    return $query
        ->whereNull('deleted_at')
        ->where('active', 1);
}
  • 修改Page类型的subpages字段,用@hasMany指令绑定作用域
type Page {
    id: ID!
    name: String!
    slug: String!
    active: Boolean
    subpages: [Page!] @hasMany(scope: "graphQLSubpagesFilter")
    created_at: DateTime!
    updated_at: DateTime!
}

额外优化建议

你当前PageTree查询类中的写法是先拉取用户所有页面再用集合过滤,数据量较大时性能较差,建议改成查询构造器层面过滤:

class PageTree
{
    public function __invoke($_, array $args){
        $user = Auth::user();
        return $args['id'] 
            ? $user->pages()->where('parent_id', $args['id'])->get() 
            : $user->pages()->whereNull('parent_id')->get();
    }
}

内容的提问来源于stack exchange,提问作者joh3rd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 18:57:03