Модель в Laravel Observer не соответствует базе данных - PullRequest
0 голосов
/ 13 января 2020

У меня есть наблюдатель, настроенный для сохранения экземпляра user. Однако экземпляр модели, переданный в метод наблюдателя, состоит из данных до вставки в базу данных. Событие запускается при запуске мутации GraphQL через Lighthouse. Если я вручную установлю группы пользователей и сохраню их, наблюдатель будет работать так, как ожидалось.

Вот пример, который устанавливает группы пользователей:

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

.

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Я думаю, что ваши groups отношения BelongsToMany? Итак, когда пользователь имеет значение saved, группы еще не синхронизированы, потому что в фоновом режиме он выполняет что-то вроде этого:

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

Итак, я думаю, что вы можете использовать @event

0 голосов
/ 13 января 2020

Вы должны перезагрузить отношения вашего $user экземпляра, у вас есть несколько способов сделать это:

  1. Вызовите refresh() метод после сохранения, который перезагрузит текущий экземпляр модели с атрибутами fre sh и всеми загруженными отношениями из базы данных:

    • $user->refresh();
  2. Вручную перезагрузите все загруженные отношения после сохранить:

    • $user->load(collect($user->getRelations())->except('pivot')->keys()->toArray());
  3. Вручную перезагрузить заданные отношения c после сохранения:

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

Вызовите все это в верхней части сохраненной функции наблюдателя:

public function saved(User $user)
{
    // re-eager-load `groups` relationship 
    $user->load('groups');
    dump($user->groups->toArray());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...