为什么vuex-orm在关系字段中返回null?

时间:2019-05-26 13:08:04

标签: vue.js vuex

我遵循了Vuex ORM中Defining Relationships的指导。

我做了所有类似于指南的事情,那么为什么我在Article Model的category字段中得到空值?

codesandbox

这就是我定义模型的方式(文章类别为:hasOne / belongTo):

pipeline { 
    agent 'docker'
    stages {
      stage('Common pre') { ... }
      stage('Build all platforms') {
      parallel {
        stage('Build, test and deploy for P1') {
            agent {
                dockerfile {
                   filename 'src/main/docker/Jenkins-P1.Dockerfile'
                   reuseNode true
                }
            }
            steps {
               sh buildit...
            }
        }
        stage('Build, test and deploy for P2') {
            agent {
                dockerfile {
                   filename 'src/main/docker/Jenkins-P2.Dockerfile'
                   reuseNode true
                }
            }
            steps {
               sh buildit...
            }
        }
      }
      }
      stage('Common post parallel') { ... }
    }
}

export class Category extends Model { static entity = "categories"; static primaryKey = "_id"; static fields() { return { _id: this.attr(null), name: this.attr("") }; } } export class Article extends Model { static entity = "articles"; static primaryKey = "_id"; static fields() { return { _id: this.attr(null), name: this.attr(""), category: this.hasOne(Category, "_id") }; } } 中用vuex配置Vuex-orm:

main.js

在内部应用程序组件中,我拥有插入到vuex的数据并获得如下值:

import VuexORM from "@vuex-orm/core";
import { Article, Category } from "./models";

Vue.use(Vuex);

const database = new VuexORM.Database();

const Articles = {
  namespaced: true,

  actions: {
    test() {
      console.log(this);
    }
  }
};

const Categories = {
  namespaced: true,

  actions: {
    test() {
      console.log(this);
    }
  }
};

database.register(Article, Articles);
database.register(Category, Categories);

const store = new Vuex.Store({
  plugins: [VuexORM.install(database)]
});

1 个答案:

答案 0 :(得分:0)

首先,文章与类别之间的关系很可能是一对多的关系,但是代码的问题在于定义模型和插入数据的方式。

在您的示例中,您尝试在关系目标上提供外键(我是文章,我知道我所属的类别ID)。这种关系是Vuex-ORM中的一对一逆关系。

为了获得预期的行为,请按以下方式更改Article模型:

export class Article extends Model {
  static entity = "articles";

  static primaryKey = "_id";

  static fields() {
    return {
      _id: this.attr(null),
      name: this.attr(""),
      category_id: this.attr(""),
      category: this.belongsTo(Category, "category_id")
    };
  }
}

请注意,您将category_id明确定义为Article模型上的单独字段,而不是指向Category模型上的id字段。在所有Vuex-ORM关系中,这都是相同的模式。 category字段存储已解析的关系目标对象,因此您是目标类别对象。使用.with(Category)查询后,该字段由Vuex-ORM填写,并且不应包含在您插入的数据中。

尽管并没有多大意义,但要修复原始示例并使用标准的一对一定义模型,如下所示:

export class Article extends Model {
  static entity = "articles";

  static primaryKey = "_id";

  static fields() {
    return {
      _id: this.attr(null),
      name: this.attr(""),
      category: this.hasOne(Category, "article_id")
    };
  }
}

export class Category extends Model {
  static entity = "categories";

  static primaryKey = "_id";

  static fields() {
    return {
      _id: this.attr(null),
      name: this.attr(""),
      article_id: this.attr(null),
    };
  }
}

并在您传递给Article.insertOrUpdate的数据中提供一个article_id。