Laravel spatie/laravel-activitylog — вызов неопределенного отношения [user] в модели [SpatieActivitylogModelsActivity]

#php #laravel #laravel-8 #activitylog

#php #laravel #laravel-8 #activitylog

Вопрос:

Я только что обновил фреймворк своего проекта с версии 7 до версии 8 (последняя версия laravel на эту дату). Все работает, за исключением журналов активности, которые вызывают эту ошибку:

IlluminateDatabaseEloquentRelationNotFoundException Call to undefined relationship [user] on model [SpatieActivitylogModelsActivity].

Эта ошибка появляется только после того, как я обновил laravel и все зависимости composer, включая spatie/laravel-activitylog . Я следовал этим инструкциям из laravel docs для получения инструкций по обновлению структуры проекта (руководство по обновлению). Я также проверил список изменений spatie/laravel-activitylog на github, и текущая последняя версия поддерживает Laravel 8 (версия 3.16.1 той же версии, которую я использую в своем проекте).

Вот мой код для SpatieActivitylogModelsActivity класса:

 <?php

namespace SpatieActivitylogModels;

use IlluminateDatabaseEloquentBuilder;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentRelationsMorphTo;
use IlluminateSupportArr;
use IlluminateSupportCollection;
use SpatieActivitylogContractsActivity as ActivityContract;

class Activity extends Model implements ActivityContract
{
public $guarded = [];

protected $casts = [
    'properties' => 'collection',
];

public function __construct(array $attributes = [])
{
    if (! isset($this->connection)) {
        $this->setConnection(config('activitylog.database_connection'));
    }

    if (! isset($this->table)) {
        $this->setTable(config('activitylog.table_name'));
    }

    parent::__construct($attributes);
}

public function subject(): MorphTo
{
    if (config('activitylog.subject_returns_soft_deleted_models')) {
        return $this->morphTo()->withTrashed();
    }

    return $this->morphTo();
}

public function causer(): MorphTo
{
    return $this->morphTo();
}

public function getExtraProperty(string $propertyName)
{
    return Arr::get($this->properties->toArray(), $propertyName);
}

public function changes(): Collection
{
    if (! $this->properties instanceof Collection) {
        return new Collection();
    }

    return $this->properties->only(['attributes', 'old']);
}

public function getChangesAttribute(): Collection
{
    return $this->changes();
}

public function scopeInLog(Builder $query, ...$logNames): Builder
{
    if (is_array($logNames[0])) {
        $logNames = $logNames[0];
    }

    return $query->whereIn('log_name', $logNames);
}

public function scopeCausedBy(Builder $query, Model $causer): Builder
{
    return $query
        ->where('causer_type', $causer->getMorphClass())
        ->where('causer_id', $causer->getKey());
}

public function scopeForSubject(Builder $query, Model $subject): Builder
{
    return $query
        ->where('subject_type', $subject->getMorphClass())
        ->where('subject_id', $subject->getKey());
}
}
 

И вот мой код для User модели:

 <?php

namespace App;

use IlluminateContractsAuthMustVerifyEmail;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use SpatieActivitylogTraitsLogsActivity;
use SpatiePermissionTraitsHasRoles;

class User extends Authenticatable
{
use Notifiable, LogsActivity, HasRoles; 

protected static $ignoreChangedAttributes = ['password', 'updated_at'];

protected $fillable = [
    'first_name', 'last_name', 'gender', 'birthdate', 'user_contact', 'status', 'email', 'password',
];

protected static $logAttributes = 
[
    'first_name', 'last_name', 'gender', 'birthdate', 'user_contact', 'status', 'email', 'password',
];

protected static $logOnlyDirty = true;
protected static $logName = 'User';

protected $hidden = [
    'password', 'remember_token',
];

protected $casts = [
    'email_verified_at' => 'datetime',
];

public function getDescriptionForEvent(string $eventName): string
{
    return "A user has been {$eventName}";
}
}
 

Где я должен определить отношение и / или как именно я должен устранить ошибку?

Комментарии:

1. какая версия журнала активности пространства у вас есть?

2. @N69S версия 3.16.1 (последняя и поддерживающая Laravel 8)

3. как вы вызываете модель?

4. @Tpojka попробовал это, но выдает мне эту ошибку: SymfonyComponentErrorHandlerErrorFatalError Cannot declare class AppModelUser, because the name is already in use

5. уже решено. Я опубликовал решение 🙂 спасибо, что пытались мне помочь! ценю это!

Ответ №1:

Мне удалось устранить проблему. Восстановил старые файлы проекта и сравнил код из старого Activity.php с текущим обновленным Activity.php

Обновление пакета spatie заменило существующий файл на новый Причина проблемы: таким образом, были удалены определенные функции отношений внутри моего Activity.php в Spatie Activitylog Models.

Решение: определите связь между User моделью и Activity моделью внутри Activity.php :

 public function user(){
    return $this->belongsTo('AppUser', 'causer_id'); //arg1 - Model, arg2 - foreign key
}