50

I need to be able to get a Models Relationship including its soft deleted elements, but only for this 1 instance. I do not want to change the model so that every time I use the relationship it returns all the soft deleted records too.

How can I achieve this?

User Model

class User extends Authenticatable
{
  public function contacts(){
    return $this->hasMany('App\Contacts','user_id','id');
  }
}

Controller

$user = User::findOrFail($id);
//Need to be able to get the trashed contacts too, but only for this instance and in this function
$user->contacts->withTrashed(); //Something like this
return $user;

How can I get the trashed rows only this 1 time inside my controller?

Thanks

1
  • The problem is using $user->contacts returns collection of related records of contacts to user, while $user->contacts() will make a new query` Commented Aug 2, 2018 at 13:29

4 Answers 4

97

You can use withTrashed method in different ways.

To associate the call with your relationship you can do as follows:

public function roles() {
    return $this->hasMany(Role::class)->withTrashed();
}

To use the same in the fly:

$user->roles()->withTrashed()->get();

For your special scenario:

$user->contacts()->withTrashed()->get();
Sign up to request clarification or add additional context in comments.

2 Comments

It completely wen't over my head to just run the withTrashed() method in the view itself where I am looping over it. Probably the cleanest way to achieve this, thanks!
How can I filter records when fetching records using withTrashed()? laracasts.com/discuss/channels/laravel/…
51

You can also eager load them by adding a clause to the with() method

$user = User
   ::with(['contacts' => fn($q) => $q->withTrashed()])
   ->findOrFail($id);

1 Comment

You can also do company.user for nested relations for example.
4

Looking at the Laravel Documentation on Querying soft deleted models:

//The withTrashed method may also be used on a relationship query: 
$flight->history()->withTrashed()->get(); 

The problem is using $user->contacts returns collection of related records of contacts to user, while $user->contacts() will make a new query.

1 Comment

How would you go about nested relationships? A belongsToMany B and B hasMany C? I need a way to say "Give me ALL results for A (including trashed) where ALL relations (B and B->C) show trashed elements". Is this possible?
1

You can do this with:

$user = User::findOrFail($id);

$user->contacts()->withTrashed()->get(); //get all results

return $user;

When you call the relation with (), you can append the withTrashed() method. After that you need to get() the results.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.