Snažím se, aby Graphql server s Mikro-orm a mají problém.
Tady je můj Produkt.ts subjektu;
import {
Entity,
IdentifiedReference,
ManyToOne,
PrimaryKey,
Property
} from '@mikro-orm/core'
import { Field, Float, ObjectType } from 'type-graphql'
import { ProductArguments } from '../util/types'
import { Category } from './Category'
@Entity()
@ObjectType()
export class Product {
constructor({ title, price, description }: ProductArguments) {
this.title = title
this.price = price
this.description = description
}
@Field()
@PrimaryKey()
id!: number
@Field()
@Property()
title!: string
@Field()
@Property()
imageUrl!: string
@Field(() => Float)
@Property({ type: 'decimal' })
price!: number
@Field(() => String)
@Property({ type: 'text' })
description!: string
@Field(() => Category)
@ManyToOne(() => Category)
category!: IdentifiedReference<Category>
@Field()
@Property()
createdAt: Date = new Date()
@Field()
@Property({ onUpdate: () => new Date() })
updatedAt: Date = new Date()
}
Tady je moje Kategorie.ts subjekt
import {
Cascade,
Collection,
Entity,
LoadStrategy,
OneToMany,
PrimaryKey,
Property
} from '@mikro-orm/core'
import { Field, ObjectType } from 'type-graphql'
import { Product } from './Product'
@Entity()
@ObjectType()
export class Category {
constructor(title: string) {
this.title = title
}
@Field()
@PrimaryKey()
id!: number
@Field()
@Property()
title!: string
@Field(() => [Product])
@OneToMany({
entity: () => Product,
mappedBy: (product) => product.category,
cascade: [Cascade.REMOVE],
strategy: LoadStrategy.JOINED
})
products = new Collection<Product>(this)
@Field()
@Property()
createdAt: Date = new Date()
@Field()
@Property({ onUpdate: () => new Date() })
updatedAt: Date = new Date()
}
V podstatě jsem mít one-to-many vztah s kategorie a produktu. Každý produkt by měl patřit do kategorie a kategorie může mít více výrobků.
Nyní ve své resolvery, snažím se dostat všechny kategorie, s následující.
const categories = await em
.createQueryBuilder(Category)
.select('*')
.getResult()
return em.populate(categories, ['products'])
To funguje naprosto v pořádku. Žádné chyby. Ale když jsem se pokusit se získat všechny produkty s jejich kategorií, jako je následující:
const products = await em
.createQueryBuilder(Product)
.select('*')
.getResult()
return em.populate(products, ['category'])
Nebo s left join
return em
.createQueryBuilder(Product, 'p')
.select('*')
.leftJoinAndSelect('p.category', 'c')
.getResultList()
Jsem dostal následující chybu Tady je vygenerovaný dotaz.
vyberte "p".*, "c"."id" jako "c__id", "c"."název" jako "c__title", "c"."created_at" jako "c__vytvořen_v", "c"."updated_at" jako "c__aktualizován_v" z "výrobku" jako "p" left join "skupiny" jako "c" na "p"."category_id" = "c"."id"``
Také jsem se snažil ke spuštění tohoto dotazu v databázi a mám skutečný výsledek, který jsem chtěl. Ale v graphql, dostanu následující chybu. Co dělám špatně?
{
"message": "Cannot return null for non-nullable field Category.title.",
"locations": [
{
"line": 11,
"column": 7
}
],
"path": [
"products",
0,
"category",
"title"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"stacktrace": [
"Error: Cannot return null for non-nullable field Category.title.",