一对多关系 - 如何实现推送

时间:2014-11-28 09:34:09

标签: laravel eloquent

我正在尝试执行一个插入操作,它将为一个表创建一个父记录,然后将链接回父记录的记录插入到另一个表中。

换句话说:用户填写课程信息表,然后在同一页面上完成一系列问题。提交时,课程信息将插入到自己的表格中,然后将问题插入到单独的表格中。

我的课程模型是:

class CourseVerification extends Eloquent
{

    public function courseverificationqanda()
    {
        return $this->hasMany('CourseVerificationQandA', 'id', 'verification_id');
    }

我的问题模型是:

class CourseVerificationQandA extends InnovedBaseModel
{

    public function courseverification()
    {
        return $this->belongsTo('CourseVerification');
    }

在表单提交时,我的控制器正在执行此操作:

        // create course verification record first
        $veri = new CourseVerification;
        $veri->verification_date = $input['verification_date'];

        // create collection to store questions
        $collection = new Illuminate\Database\Eloquent\Collection();

        // loop through submitted questions and push them to the collection
        for($i = 0; $i < count(Input::get('question_id')); $i++) {

            $answer = new CourseVerificationQandA;
            $answer->question_id = $input['question_id'][$i];
            $answer->answer = $input['answer'][$i];
            $answer->additional_notes = $input['additional_notes'][$i];

            $collection->push($answer);
        }

        // add collection to quesetion relation
        $veri->courseverificationqanda = $collection;

        // insert both course record and questions
        $veri->push();

push方法然后错误并调试SQL命令

insert into `CourseVerification` 
(`verification_date`, `topic_id`, `course_id`, `verifier_id`,`iv_status`, 
`verification_type`, `courseverificationqanda`, `created_by`) 
values 
(29/10/2014, 1294, 47, 1, 1, I, [{"question_id":"2","answer":"0","additional_notes":""},
{"question_id":"3","answer":"0","additional_notes":""},
{"question_id":"4","answer":"0","additional_notes":""}], 1)

正如您所看到的那样,将集合分配给$ veri-&gt; courseverificationqanda然后在SQL查询实际上与问题表的关系时被视为表列。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

你有一些错误。

您不会将关系分配给关系。您需要加载该关系(在这种情况下作为集合)并按下它,然后只保存所有内容:

$veri = new CourseVerification;
$veri->verification_date = $input['verification_date'];

// Save the parent model before you can add its children
if ($veri->save())
{
  // loop through submitted questions and push them to the collection
  for($i = 0; $i < count(Input::get('question_id')); $i++) {

    $answer = new CourseVerificationQandA;

    // associate with the parent model
    // explicitly
    $answer->verification_id = $veri->getKey();
    // or the eloquent way
    // $answer->courseverification()->associate($veri);

    $answer->question_id = $input['question_id'][$i];
    $answer->answer = $input['answer'][$i];
    $answer->additional_notes = $input['additional_notes'][$i];

    $veri->courseverificationqanda->push($answer);
  }
}

// save both course record and questions
$veri->push();

另一件事是你的关系,这两者都错了

// this is how it should look like
// CourseVerification
public function courseverificationqanda()
{
    return $this->hasMany('CourseVerificationQandA', 'verification_id', 'id');
}

// QandA
public function courseverification()
{
    return $this->belongsTo('CourseVerification', 'verification_id');
}

在第一种情况下,你换了钥匙,所以它会起作用,但不是应该的方式。

在第二种情况下,您根本没有指定外键,因此Eloquent会在表中查找courseverification_id(method_name_id)。