Laravel Eloquent:将模型与相关的子模型一起存储

时间:2015-09-02 15:26:50

标签: laravel eloquent

我得到了模特考试和问题。简化代码:

class Exam {
    public function questions() {
        return $this->hasMany('Question');
    }
    // ...
}

class Question {
    public function exam() {
        return $this->belongsTo('Exam');
    }
    // ...
}

现在我想上传一份包含考试数据的文件。解析器类应创建考试而不保存。然后逐渐创建问题并添加到考试中。最后,一切都应保存在交易中。

class ExamParser {
    $exam = new Exam();
    // ...
    while ($linesRemaining) {
        $question = new Question();
        // ...
        $exam->questions[] = $question;    // something like this?
    }
    $exam->saveTogetherWithQuestions();    // how do i realize this?
}

我基本上知道如何保存相关模型,但不知道如何将它们关联起来并稍后保存整个构造。

1 个答案:

答案 0 :(得分:0)

首先创建一个Question数组。然后创建一个Exam,并通过Exam的关系保存所有问题。将所有代码放入交易中。

已更新:已将模型创建移出事务执行。

$questions = [];
while ($linesRemaining) {
    $question = new Question();
    // ...
    $questions[] = $question;
}

$exam = new Exam();
// ...

DB::transaction(function() {
    $exam->save();
    $exam->questions()->saveMany($questions);
});

重要提示您必须在Exam附加Question之前保存Exam。父Question必须首先拥有自己的主键(通过保存自己)以允许附加成功。否则,您将在没有父母身份的情况下保存Models.py Created on 4 Sep 2015 @author: ''' # -*- coding: utf-8 -*- from openerp import models, fields, api # class test(model.Model): # _name = 'test.test' # name = fields.Char() __init__.py from . import controllers from . import models __openerp__.py file { 'name': "models", 'version': '1.0', 'depends': ['base'], 'author': "Elliot", 'category': 'Category', 'description': """ My first working module. """, 'installable': True, 'auto_install': False, 'data': [ 'templates.xml', ], 'xml': [ 'xml.xml' ], } controllers.py from openerp import http # class test_mod(http.Controller): # @http.route('/test_mod/model/', auth='public') # def index(self, **kw): # return "Hello, world" # @http.route('/test_mod/model/objects/', auth='public') # def list(self, **kw): # return http.request.render('test_mod.listing', { # 'root': '/Test_mod/Test_mod', # 'objects': http.request.env['test_mod.model'].search([]), # }) # @http.route('/test_mod/model/objects/<model("test_mod.model"):obj>/', auth= 'public') # def object(self, obj, **kw): # return http.request.render('test_mod.object', { # 'object': obj # }) and templates.xml <openerp> <data> <!-- <template id="listing"> --> <!-- <ul> --> <!-- <li t-foreach="objects" t-as="object"> --> <!-- <a t-attf-href="{{ root }}/objects/{{ object.id }}"> --> <!-- <t t-esc="object.display_name"/> --> <!-- </a> --> <!-- </li> --> <!-- </ul> --> <!-- </template> --> <!-- <template id="object"> --> <!-- <h1><t t-esc="object.display_name"/></h1> --> <!-- <dl> --> <!-- <t t-foreach="object._fields" t-as="field"> --> <!-- <dt><t t-esc="field"/></dt> --> <!-- <dd><t t-esc="object[field]"/></dd> --> <!-- </t> --> <!-- </dl> --> <!-- </template> --> </data> </openerp>