admin管理员组

文章数量:1287840

I'm trying to populate a specific relation, using the relation name (categories) in bination with the populate parameter but it doesn't populate the categories.

When I look at my schema, I see that the relational field is present in the attributes object. But I still only get the non-relational fields in my response.

I tried every bination mentioned on the Strapi documentation but none of them worked.

The find permission is also enabled for the content-types that are being populated which in this case is categories.

/api/products?populate=*
/api/products?populate[0]=categories
/api/products?populate[categories]=*

My Product schema

{
  "kind": "collectionType",
  "collectionName": "products",
  "info": {
    "singularName": "product",
    "pluralName": "products",
    "displayName": "Product",
    "description": ""
  },
  "options": {
    "draftAndPublish": true
  },
  "pluginOptions": {},
  "attributes": {
    "title": {
      "type": "string"
    },
    "images": {
      "type": "media",
      "multiple": true,
      "required": false,
      "allowedTypes": [
        "images"
      ]
    },
    "categories": {
      "type": "relation",
      "relation": "oneToMany",
      "target": "api::category.category"
    }
  }
}

System

  • Strapi version: 4.1.8
  • NPM version: 8.3.2
  • Node.js version: 16.13.2
  • Database: MySQL

I'm trying to populate a specific relation, using the relation name (categories) in bination with the populate parameter but it doesn't populate the categories.

When I look at my schema, I see that the relational field is present in the attributes object. But I still only get the non-relational fields in my response.

I tried every bination mentioned on the Strapi documentation but none of them worked.

The find permission is also enabled for the content-types that are being populated which in this case is categories.

/api/products?populate=*
/api/products?populate[0]=categories
/api/products?populate[categories]=*

My Product schema

{
  "kind": "collectionType",
  "collectionName": "products",
  "info": {
    "singularName": "product",
    "pluralName": "products",
    "displayName": "Product",
    "description": ""
  },
  "options": {
    "draftAndPublish": true
  },
  "pluginOptions": {},
  "attributes": {
    "title": {
      "type": "string"
    },
    "images": {
      "type": "media",
      "multiple": true,
      "required": false,
      "allowedTypes": [
        "images"
      ]
    },
    "categories": {
      "type": "relation",
      "relation": "oneToMany",
      "target": "api::category.category"
    }
  }
}

System

  • Strapi version: 4.1.8
  • NPM version: 8.3.2
  • Node.js version: 16.13.2
  • Database: MySQL
Share Improve this question edited May 7, 2022 at 12:45 0xsh asked May 7, 2022 at 12:27 0xsh0xsh 1,5953 gold badges12 silver badges20 bronze badges
Add a ment  | 

3 Answers 3

Reset to default 6

You need to enable find permission on the product as well. You have to set the find permission on all the relationships (or sub-tables).

Use the "role" option.

Edit: Other choice is to use populate deep from strapi marketplace, just install, configure the default depth and then on every request where you want deep just add populate: deep

you will have to populate inside your controller, as in Strapi documentation

Query Engine API: Populating

strapi.db.query('api::article.article').findMany({
 populate: true,
});

Entity Service API: Populating

const entries = await strapi.entityService.findMany('api::article.article', {
  populate: '*',
});

REST API: Population & Field Selection

const qs = require('qs');
const query = qs.stringify({
  fields: ['title', 'body'],
}, {
  encodeValuesOnly: true,
});

If you want to populate everything just use populate: '*'

If you want to populate a relation or more use populate: [relationOne, relationTwo]

As an Example If you want to fetch data from db based on some conditions and populate one relationship

const transactions = await strapi
        .query("api::transaction.transaction")
        .findMany({
          where: { user: userId },
          populate: { offer: true },
        });

here the result If you want to populate all relations

const transactions = await strapi
        .query("api::transaction.transaction")
        .findMany({
          where: { user: userId },
          populate: "*",
        });

本文标签: javascriptStrapi v4 no relational fields when populatingStack Overflow