Laravel - 保存新的相关成员不会更新父级

时间:2014-07-16 15:14:26

标签: php laravel laravel-4

我有这两个模型(更改了这个例子的名称,因为它们不是英文):

Task

public function times() {
    return $this->hasMany('TaskTime', 'id');
}

TaskTime

public function task() {
    return $this->belongsTo('Task', 'task_id');
}

另外,在模型Task中,我有这个方法:

public function start() {
    $now = Carbon\Carbon::now();
    $time = new TaskTime;
    $time->task()->associate($this);
    $time->beginning = $now->toDateTimeString();
    $time->save();

    // testing
    echo $this->times()->get()->toJson();
    echo '<br/><br/>';
    echo $this->toJson();
    die();
}

当我调用start()方法时,它正确地在TaskTime对应的表中保存了一个新行,外键正确设置为Task。< / p>

echo $this->tempos()->get()->toJson();正确打印行,包括新行。

echo $this->toJson();行不会打印新行!只打印旧的。

我已在save()push()中尝试$this$time,但仍然无法打印更新后的数据!

有什么可能导致这种情况的想法?我从昨天起就试图调试这个东西而且我的想法已经用完了......

1 个答案:

答案 0 :(得分:2)

问题是,在Eloquentattachingsaving等之后,associating不会更新已加载模型的关系。

它创造了这种关系,即。插入/更新必要的表(attachsavesaveMany)或在模型上设置关系而不在db(associate)中保存任何内容。

因此,在您的情况下,$this不知道新创建的$tempo已与之关联。

现在,

`$this->tempos()->get()->toJson();` 

运行新查询以获取相关的tempos,这就是您获得正确结果的原因,但

`$this->tempos;
在关联新文件之前必须已加载

,因此不会从数据库中重新加载,因此您将获得旧版本的“旧版本”。结果


你需要的是:

public function start() {

    // do what you need with $time
    $tempo->task()->associate($this);
    $tempo->save();

    $this->load('tempos'); // reloads relation from db

    // or:
    $this->tempos->add($tempo); // manually add newly created model to the collection
}

请注意,如果$this->tempos尚未加载,后一种解决方案将导致意外结果。