diff --git a/packages/playground/admin/app/pages/grid.tsx b/packages/playground/admin/app/pages/grid.tsx
index 297b487f9..985986973 100644
--- a/packages/playground/admin/app/pages/grid.tsx
+++ b/packages/playground/admin/app/pages/grid.tsx
@@ -279,7 +279,7 @@ const CustomGridRow = Component(() => (
- accessor.length} />
+
diff --git a/packages/playground/api/migrations/2024-06-10-144526-grid-article-view.json b/packages/playground/api/migrations/2024-06-10-144526-grid-article-view.json
new file mode 100644
index 000000000..77766071f
--- /dev/null
+++ b/packages/playground/api/migrations/2024-06-10-144526-grid-article-view.json
@@ -0,0 +1,106 @@
+{
+ "formatVersion": 5,
+ "modifications": [
+ {
+ "modification": "createView",
+ "entity": {
+ "eventLog": {
+ "enabled": true
+ },
+ "name": "GridArticleDetail",
+ "primary": "id",
+ "primaryColumn": "id",
+ "tableName": "grid_article_detail",
+ "fields": {
+ "id": {
+ "name": "id",
+ "columnName": "id",
+ "columnType": "uuid",
+ "nullable": false,
+ "type": "Uuid"
+ },
+ "commentsCount": {
+ "name": "commentsCount",
+ "columnName": "comments_count",
+ "columnType": "integer",
+ "nullable": false,
+ "type": "Integer"
+ },
+ "article": {
+ "type": "OneHasOne",
+ "name": "article",
+ "target": "GridArticle",
+ "joiningColumn": {
+ "columnName": "article_id",
+ "onDelete": "restrict"
+ },
+ "nullable": false,
+ "inversedBy": "details"
+ }
+ },
+ "unique": [],
+ "indexes": [],
+ "view": {
+ "sql": "\n\tSELECT\n\t\tarticle.id AS id,\n\t\tarticle.id AS article_id,\n\t\t(SELECT COUNT(*)\n\t\t FROM \"grid_article_comment\" comment\n\t\t WHERE comment.article_id = article.id) AS comments_count\n\tFROM \"grid_article\" article;\n"
+ }
+ }
+ },
+ {
+ "modification": "createRelationInverseSide",
+ "entityName": "GridArticle",
+ "relation": {
+ "type": "OneHasOne",
+ "name": "details",
+ "target": "GridArticleDetail",
+ "ownedBy": "article",
+ "nullable": true
+ }
+ },
+ {
+ "modification": "patchAclSchema",
+ "patch": [
+ {
+ "op": "add",
+ "path": "/roles/admin/entities/GridArticleDetail",
+ "value": {
+ "predicates": {},
+ "operations": {
+ "read": {
+ "id": true,
+ "article": true,
+ "commentsCount": true
+ },
+ "create": {
+ "id": true,
+ "article": true,
+ "commentsCount": true
+ },
+ "update": {
+ "id": true,
+ "article": true,
+ "commentsCount": true
+ },
+ "delete": true,
+ "customPrimary": true
+ }
+ }
+ },
+ {
+ "op": "add",
+ "path": "/roles/admin/entities/GridArticle/operations/read/details",
+ "value": true
+ },
+ {
+ "op": "add",
+ "path": "/roles/admin/entities/GridArticle/operations/create/details",
+ "value": true
+ },
+ {
+ "op": "add",
+ "path": "/roles/admin/entities/GridArticle/operations/update/details",
+ "value": true
+ }
+ ]
+ }
+ ]
+}
diff --git a/packages/playground/api/model/Grid.ts b/packages/playground/api/model/Grid.ts
index 9b8670245..02e3c4ea8 100644
--- a/packages/playground/api/model/Grid.ts
+++ b/packages/playground/api/model/Grid.ts
@@ -14,6 +14,7 @@ export class GridArticle {
tags = c.manyHasMany(GridTag)
views = c.intColumn()
comments = c.oneHasMany(GridArticleComment, 'article')
+ details = c.oneHasOneInverse(GridArticleDetail, 'article')
}
export class GridTag {
@@ -37,3 +38,17 @@ export class GridArticleComment {
content = c.stringColumn()
createdAt = c.dateTimeColumn()
}
+
+@c.View(`
+ SELECT
+ article.id AS id,
+ article.id AS article_id,
+ (SELECT COUNT(*)
+ FROM "grid_article_comment" comment
+ WHERE comment.article_id = article.id) AS comments_count
+ FROM "grid_article" article;
+`)
+export class GridArticleDetail {
+ article = c.oneHasOne(GridArticle, 'details').notNull()
+ commentsCount = c.intColumn().notNull()
+}