Laravel eloquent with Trashed on relationship

40,323

Solution 1

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();

Solution 2

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

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

Solution 3

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.

Share:
40,323

Related videos on Youtube

S_R
Author by

S_R

Updated on October 27, 2021

Comments

  • S_R
    S_R over 2 years

    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

    • Oluwatobi Samuel Omisakin
      Oluwatobi Samuel Omisakin over 5 years
      The problem is using $user->contacts returns collection of related records of contacts to user, while $user->contacts() will make a new query`
  • S_R
    S_R over 5 years
    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!
  • Julian
    Julian over 5 years
    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?
  • hassanrazadev
    hassanrazadev about 4 years
    How can I filter records when fetching records using withTrashed()? laracasts.com/discuss/channels/laravel/…
  • Vahid Amiri
    Vahid Amiri almost 2 years
    You can also do company.user for nested relations for example.