GraphQL query receive empty array from DataObject

I’m trying to use graphql to query photo detail from a photo page (has ImageObject - DataObject). The query work well when using internal IDE (/dev/graphql/ide) but when using an external IDE (GraphQL Playground on Mac or Postman) it only return some page data but empty array for the photo. Tried to add authorization in header “Authorization”: “Basic xxxxx” but no luck. Any one know what was wrong?

model.yml

PhotoPage:
  fields: "*"
  operations:
    read:
      plugins:
        paginateList: false

graphql query

query{
  readPhotoPages{
    title
    content
    photos{
      nodes{
        id
      }
    }
  }
}

return from GraphQL app

{
  "data": {
    "readPhotoPages": [
      {
        "title": "Photos",
        "content": "<p>Photo contents</p>",
        "photos": {
          "nodes": []
        }
      }
    ]
  }
}

return from /dev/graphql/ide

{
  "data": {
    "readPhotoPages": [
      {
        "title": "Photos",
        "content": "<p>Photo contents</p>",
        "photos": {
          "nodes": [
            {
              "id": "1"
            },
            {
              "id": "3"
            },
            {
              "id": "4"
            }
          ]
        }
      }
    ]
  }
}

PhotoPage.php

<?php

use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
class PhotoPage extends Page{
    private static $db = [
        'Title' => 'Text',
    ];
    private static $has_many = [
        'Photos' => ImageObject::class
    ];
    private static $owns = [
        'Photos',
    ];
    private static $summary_fields = [
        'Thumbnail'
    ];
    public function getPhotoThumbnail() {
        // display a thumbnail of the Image from the has_one relation
        return $this->Photos() ? $this->Photos()->CroppedImage(50,50) : '';
    }
    public function getCMSFields()
    {
        $fields = parent::getCMSFields();

        $fields->addFieldsToTab(
            'Root.Photos',
            $photo = GridField::create(
                'Photos',
                'Photo',
                $this->Photos(),
                GridFieldConfig_RecordEditor::create()
            )
        );
        return $fields;
    }

}

ImageObject.php

<?php
use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;
use SilverStripe\Forms\TextareaField;
use SilverStripe\Assets\File;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
class ImageObject extends DataObject{
    private static $db = [
        'Title' => 'Varchar',
        'Description' => 'Text'
    ];
    private static $table_name = 'images';
    private static $has_one =[
        'PhotoPage' => PhotoPage::class,
        'PhotoSource' => Image::class
    ];
    private static $owns =[
        'PhotoSource'
    ];
    public function getCMSFields()
    {
        $fields = FieldList::create(
            TextField::create('Photo Title'),
            TextareaField::create('Description'),
            UploadField::create('PhotoSource')
        );
        return $fields;
    }
}
1 Like

DataObject returns false for non-admin users by default.You need to implement an appropriate canView() method for your ImageObject class.