我有这两个模型(更改了这个例子的名称,因为它们不是英文):
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
,但仍然无法打印更新后的数据!
有什么可能导致这种情况的想法?我从昨天起就试图调试这个东西而且我的想法已经用完了......
答案 0 :(得分:2)
问题是,在Eloquent
,attaching
,saving
等之后,associating
不会更新已加载模型的关系。
它创造了这种关系,即。插入/更新必要的表(attach
,save
,saveMany
)或在模型上设置关系而不在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
尚未加载,后一种解决方案将导致意外结果。