질문을 삭제하지 말아주세요.!
 
1
0
-1

Laravel Activitylog 라는 패키지를 사용해서 DB 활동을 로깅하려고 합니다.

https://docs.spatie.be/laravel-activitylog/v3/introduction

activity_log
  id - integer
  ...
  subject_id - string
  subject_type - string

users
  id - string
  name - string 
  ...

processes
  id - integer
  name - string
  template_id - integer
  ...

templates
  id - integer
  name - string
  ...


runs
  id - integer
  name - string
  ...
class Activity
{
    ...
    public function subject(): MorphTo
    {
        return $this->morphTo();
    }
}


class User
{
    ...
}


class Run
{
    ...
}


class Process
{
    ...
    public function template() {
        return $this->belongsTo(Template::class, 'template_id', 'id');
    }
    ....
}


class Template
{
    ...
    public function usedProcesses()
    {
        return $this->hasMany(Process::class);
    }
}
class ActivityLogController extends Controller
{

    public function list()
    {
        $logs = Activity::with([
            'subject',
            // 'subject.template'
        ])->orderByDesc('updated_at')->get();

        return view('logList', compact(['logs']));
    }

}


  • Activity 는 subject 로 User, Process 등 다양한 객체를 가질 수 있게 되어 있습니다.
  • Activity list 를 출력할 때, subject 가 Process 인 경우에는 process->template->name 값이 필요해서, 각 열 마다 templates 테이블을 조회하는 쿼리가 여러번 날아가는 상황입니다.
  • 이 쿼리를 줄이기 위해 with() 에 'subject.template' 를 넣으면, User, Run 과 같은 다른 모델에 template 가 없어서 에러가 발생합니다.
    • Illuminate \ Database \ Eloquent \ RelationNotFoundException Call to undefined relationship [template] on model [App\Run].

다형성 관계에서, 목록을 표시할 때 특정 모델의 관계에 대해서만 with() 를 추가로 사용할 수 있는 방법이 있을까요?

    CommentAdd your comment...