【问题标题】:laravel + mongo + gpaphql get children arraylaravel + mongodb + graphql 获取子数组
【发布时间】:2020-12-12 21:01:13
【问题描述】:

我在 mongodb 中有数据 它是一个道路对象,具有一个属性和一个由它组成的点数组:

我在 laravel 中的模型

<?php

namespace App\Models;

use App\Traits\Uuids;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class Road extends Eloquent
{
    //use HasFactory;
    use Uuids;

    protected $connection = 'mongodb';
    protected $collection = 'roads';

    protected $fillable = ['id', 'roadId', 'code', 'name', 'points'];

    #public $timestamps = false;
    public $incrementing = false;

    public function fields() : array
    {
        return [
            'id' => [
                'type' => Type::string(),
                'description' => 'The identifier of the road',
            ],
            'roadId' => [
                'type' => Type::nonNull(Type::int()),
                'description' => 'ID road of external database',
            ],
            'code' => [
                'type' => Type::string(),
                'description' => 'code of document',
            ],
            'name' => [
                'type' => Type::nonNull(Type::string()),
                'description' => 'road name',
            ],
            'points' => [
                'name' => 'points',
                'description' => 'points of road',
                'type' => GraphQL::type('RoadPoints'),
                'is_relation' => false
            ]
        ];
    }
}

这里我们指的是一种新型的“路上点”

GraphQL 类型“路点”:

<?php

namespace App\GraphQL\Types;

use App\Models\Address;
use App\Models\RoadPoints;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Facades\GraphQL;
use Rebing\GraphQL\Support\Type as GraphQLType;

class RoadPointsType extends GraphQLType
{
    protected $attributes = [
        'name'          => 'RoadPoints',
        'description'   => 'The points is defined by the format GeoJSON Point',
        'model'         => RoadPoints::class,
    ];

    public function fields(): array
    {
        return [
            'type' => [
                'type' => Type::string(),
                'description' => 'The format GeoJSON',
            ],
            'pk' => [
                'type' => Type::string(),
                'description' => 'piket of point',
            ],
            'coordinates' => [
                'type' =>  Type::listOf(GraphQL::type('GeoJSON')),
                'description' => 'The partner lat and lng',
            ]
        ];
    }
}

RoadPoints 的 laravel 模型

模型 RoadPoints 类:

<?php

namespace App\Models;

use Jenssegers\Mongodb\Eloquent\Model as Eloquent;

class RoadPoints extends Eloquent
{
    protected $fillable = ['type', 'pk', 'coordinates'];

    protected $casts = [
        'coordinates' => 'array'
    ];
}

graphql RoadQuery:

<?php

namespace App\GraphQL\Queries;

use App\Models\Road;
use Closure;
use GraphQL\Type\Definition\Type;
use Rebing\GraphQL\Support\Query;
use App\Services\RoadService;
use GraphQL\Type\Definition\ResolveInfo;
use Rebing\GraphQL\Support\Facades\GraphQL;

class RoadQuery extends Query
{
    private $roadService;

    public function __construct(RoadService $roadService)
    {
        $this->roadService = $roadService;
    }

    protected $attributes = [
        'name' => 'Road',
        'description' => 'Query to Road data and points.'
    ];

    public function type(): Type
    {
        return Type::listOf(GraphQL::type('Road'));
    }

    public function args(): array
    {
        return [
            'id' => ['name' => 'id', 'type' => Type::string()],
            'roadId' => ['name' => 'roadId', 'type' => Type::int()],
            'code' => ['name' => 'code', 'type' => Type::string()],
            'name' => ['name' => 'name', 'type' => Type::string()],
            'lat' => ['name' => 'lat', 'type' => Type::float()],
            'lng' => ['name' => 'lng', 'type' => Type::float()]
        ];
    }

    public function resolve($root, $args, $context, ResolveInfo $resolveInfo, Closure $getSelectFields)
    {
        $fields = $resolveInfo->getFieldSelection($depth = 3);

        return $this->roadService->find($args, $fields);
    }
}

结果:

为什么 pk 和坐标为空? 请告诉我如何正确选择数组中的所有对象(点)。

【问题讨论】:

    标签: php laravel mongodb graphql


    【解决方案1】:

    模型错误

    改变

    'type' => GraphQL::type('RoadPoints'),
    

    'type' => Type::listOf(GraphQL::type('RoadPoints')),
    

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 2019-02-06
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 2023-01-14
      • 2019-12-21
      相关资源
      最近更新 更多