Laravel保存模型后需要刷新它才能使用关系

92vpleto  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(175)

我正在和一个奇怪的问题作斗争,不知道它是否应该被认为是一个bug。
我在更新过程中有这样的代码:

// initial $invoice->user_updated_id = 1

    $invoice = $this->find($id); // Invoice::findOrFail($id)
    $userId = Auth::user()->id; // $userId = 2
    $request = array_merge($request, ['user_updated_id' => $userId]);
    $invoice->fill($request);
    $invoice->save();

    Log::info('Attribute: ' . $invoice->user_updated_id);
    Log::info('Relation: ' . $invoice->userUpdated->id); // Basic relationship to User model.

输出为:

local.INFO: Attribute: 2
local.INFO: Relation: 1

为什么在保存模型之后,关系仍然得到旧模型?
如果我重写代码:

// initial $invoice->user_updated_id = 1

    $invoice = $this->find($id);
    $userId = Auth::user()->id; // $userId = 2
    $request = array_merge($request, ['user_updated_id' => $userId]);
    $invoice->fill($request);
    $invoice->save();
    $invoice->refresh();

    Log::info('Attribute: ' . $invoice->user_updated_id);
    Log::info('Relation: ' . $invoice->userUpdated->id); // Basic relationship to User model.

输出为:

local.INFO: Attribute: 2
local.INFO: Relation: 2
vawmfj5a

vawmfj5a1#

你的refresh调用可以工作,但它也是多余的,因为它刷新了你之前刚刚保存的主模型,你可能不想这样做,因为它的数据是好的。要只刷新关系,你可以使用load('userUpdated')loadMissing('userUpdated')方法。load加载一些关系,即使它们已经加载,而loadMissing只做一次。

inn6fuwd

inn6fuwd2#

只需要在load方法上声明要检索的关系作为参数,

$invoice = $this->find($id);
 $userId = Auth::user()->id; // $userId = 2
 $request = array_merge($request, ['user_updated_id' => $userId]);
 $invoice->fill($request);
 $invoice->save();
 $invoice->load('userUpdated');//this relation ship

你甚至可以调用嵌套关系,例如,如果你想要一个用户和他的联系人,在用户模型中提供你声明的与联系人的关系,你可以做如下

$invoice->load('user.contact'); //and this was just an example

相关问题