1

user我为保存实例时设置了一个观察者。但是,传递给观察者方法的模型实例包含数据库插入之前的数据。该事件是通过 Lighthouse 运行 GraphQL 突变来触发的。如果我手动设置用户组并保存它,观察者会按预期执行。

这是一个设置用户组的示例:

mutation {
  updateUser(input: {
    id: 1
    groups: {
      sync: [1]
    }
  }) {
    groups { id }
  }
}

目前我的UserObserver::saved样子:

public function saved(User $user)
{
    // Shows the groups prior to the update
    dump($user->groups->toArray());

    // Even a raw query doesn't get the updated groups
    dump(DB::select('select * from group_user where userId=1'));
}

这是使用 Laravel 5.8.35 和 Lighthouse 4.6

4

2 回答 2

1

您必须重新加载$user实例的关系,您有几种方法可以做到这一点:

  1. 保存后调用refresh()方法,它使用新属性和数据库中所有预先加载的关系重新加载当前模型实例:

    • $user->refresh();
  2. 保存后手动重新加载所有加载的关系:

    • $user->load(collect($user->getRelations())->except('pivot')->keys()->toArray());
  3. 保存后手动重新加载您的特定关系:

    • $user->load('groups');

在您保存的观察者函数之上调用其中任何一个:

public function saved(User $user)
{
    // re-eager-load `groups` relationship 
    $user->load('groups');
    dump($user->groups->toArray());
}
于 2020-01-12T22:00:26.747 回答
0

我觉得你们的groups关系是BelongsToMany一体的?因此,当 User 为 时saved,组尚未同步,因为在后台它会执行以下操作:

$user = User::create($args); // Saved event dispatched
$user->groups()->sync($args['groups']['sync']); // The groups are synced here

所以,我想你可能想使用@event

于 2020-01-13T14:13:12.407 回答