skip to Main Content

I am trying to store a simple form into my database. My model is that I have jobs which where each job can contain several task. Therefore my Models look like this:

User

public function jobs()
{
    return $this->hasMany(Job::class);
}

Job

public function user()
{
    return $this->belongsTo(User::class);
}

public function tasks()
{
    return $this->hasMany(Task::class);
}

Task

public function job()
{
    return $this->belongsTo(Job::class);
}

When I now would like to store in the TaskController.php with the following code:

    public function store(Request $request, Job $job)
    {
        $request['job_id'] = $job->id;
        $validated = $request->validate([
            'message' => 'required|string|max:255',
        ]);
 
        $request->user()->jobs()->tasks()->create($validated);
 
        return redirect(route('tasks.index'));
    }

I get the error:

Call to undefined method IlluminateDatabaseEloquentRelationsHasMany::tasks()

I am pretty sure I am doing a rookie mistake passing the $request but can not figure it out. Thank you for any help!

2

Answers


  1. Calling the relationship function ($request->user()->jobs()) will get you the relationship class (IlluminateDatabaseEloquentRelationsHasMany), not the collection itself. Accessing like $request->user()->jobs will get you the jobs collection.

    Login or Signup to reply.
  2. Your issue is that you are calling tasks on jobs, but jobs() is a relationship, not a model nor a collection.

    To fix it, you have to go over each one:

    $request->user()
        ->jobs()
        ->each(function (Job $job) use ($validated) {
            $job->tasks()
                ->create($validated);
        });
    

    Or, you could try to use a Has Many Through.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search