Grails 如何通过在数组或映射中循环来保存多行数据?

Grails 如何通过在数组或映射中循环来保存多行数据?,grails,groovy,Grails,Groovy,In-OrderController.groovy Class Buyer { String name static constraints = { } } Class Order { String ref static belongsTo = [buyer:Buyer] static constraints = { buyer(nullable:false) } } 正如您在上面的“工作”中所注意到的,如果我能够通过复制粘贴和定义新地

In-OrderController.groovy

Class Buyer {
   String name
   static constraints = {
   }
}
Class Order {
    String ref
    static belongsTo = [buyer:Buyer]
    static constraints = {
    buyer(nullable:false)
    }
}
正如您在上面的“工作”中所注意到的,如果我能够通过复制粘贴和定义新地图来保存多行,但如果我尝试循环一个数组,它将不起作用。你知道如何通过数组或映射循环来保存数据吗

如有任何问题,请告知
谢谢

您应该能够做到:

...
def someAction = {
  //working
  def data1 = ["buyer.id": 2, "ref": "xyz"]
  def ord = new Order(data1);
  ord.save();

  def data2 = ["buyer.id": 2, "ref": "234xyz"]
  def ord2 = new Order(data2);
  ord2.save();


  //But in a loop - its not working
  def items = ['abc', 'def', 'ghi', 'jkl']
  def data2 = [:]
  for(e in items) {
     data2 = ["buyer.id": 2, "ref" : e.value] //keeping buyer id same
     def ord = new Order(data2);
     ord.save();
     data2 = [:] //just emptying it?
  }
}
您收到了哪些错误(如果有)


还有,你为什么要做
e.value
?这将得到一个字符数组而不是字符串(这是您的第一个工作示例所使用的)

首先,我不确定
[“buyer.id”:2,“ref”:e.value]
,我认为应该是
[buyer:buyer.get(2),ref:e.value]

其次,我建议使用来完成任务。您可以尝试这样的操作(您需要在Buyer for Buyer Order关系中定义一个
static hasMany=[orders:Order]
关系

def someAction = {
  def items = ['abc', 'def', 'ghi', 'jkl']
  items.each { item ->
     def ord = new Order( [ 'buyer.id':2, ref:item ] )
     ord.save()
  }
}

谢谢你的回答@tim,除了使用“每个”之外,这个解决方案不是有点类似于我的吗?是的,不使用
e.value
,不使用不必要的分号,不清除地图(没有理由这样做)嗯..我对groovy非常陌生,因为我被卡住了,我尝试了各种选项,如清空映射等来对它进行排序。我需要尝试一下,看看它是如何运行的?我如何得到错误消息?是否保存(failOnError:true)??谢谢你的回答。我已经尝试过了。get()但不知怎么的,它不起作用。我需要试试你的解决方案,我会让你知道它是怎么回事。为什么你用Buyer b=new Buyer(名称:“foo”)而不是def b=new Buyer(名称:“foo”)?@Wbdvlpr:def b=new Buyer没问题。我不明白为什么Buyer.get(buyerId)失败了,它仍然提供相同的结果还是无法找到买家?
Buyer b = new Buyer(name: "foo")
for(e in items) {
     def ord = new Order(ref: e.value);
     b.addToOrders(ord)
  }

b.save(flush:true)