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.