Laravel雄辩与关系破坏

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

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

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.

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.