Получите пользовательские данные отношений с Eloquent построителем запросов - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот запрос:

FHINotification::with(['log'])
    ->where('user', $user->getSAMAccountName())
    ->whereNull('read_at')
    ->get();

Модель «Журнал» имеет функцию для получения пользовательских данных (более удобочитаемых, чем данные в дБ)

public function getData(): array
{
    Game::setWithoutStandardEdition(true);
    $ldapService = App::make('App\Services\LdapService');
    $log['url'] = $this->getUrl($this->task->resourceable_type, $this->task->string_resourceable_id);
    $log['action'] = $this->getActionName($this->action);
    $log['resource_name'] = $this->getResourceName($this->task->resourceable);
    $log['user'] = $ldapService->getUserByUsername($this->user)->getDisplayName();

    return $log;
}

Я могу назвать это метод из экземпляра Log, например: $log->getData() но возможно ли вызвать его из построителя запросов? Если нет, мне нужно l oop в моем результате запроса, чтобы отформатировать каждый из них.

Спасибо:)

1 Ответ

0 голосов
/ 06 апреля 2020

Если вы всегда хотите преобразовать свой журнал в это, вы можете использовать его, переопределив функцию toArray вашей модели:

public function toArray(): array
{
    Game::setWithoutStandardEdition(true);
    $ldapService = App::make('App\Services\LdapService');
    $log['url'] = $this->getUrl($this->task->resourceable_type, $this->task->string_resourceable_id);
    $log['action'] = $this->getActionName($this->action);
    $log['resource_name'] = $this->getResourceName($this->task->resourceable);
    $log['user'] = $ldapService->getUserByUsername($this->user)->getDisplayName();

    return $log;
}

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

$log->toArray(); 

или при наличии коллекции FHINotification:

$FHINotification_collection->toArray();

Тогда ваши журналы будут преобразованы в массив с использованием вашей пользовательской функции toArray ()

, если вы хотите чтобы получить доступ к вашему атрибуту из вашего объекта, а не приводить его к массиву, тогда вы должны использовать accessor:

public function getUrlAttribute()
{
    Game::setWithoutStandardEdition(true);
    $ldapService = App::make('App\Services\LdapService');
    return $this->getUrl($this->task->resourceable_type, $this->task->string_resourceable_id);
}

и так далее для каждого вашего атрибута

, тогда вы можете использовать его при этом:

$log->url

...