Laravelでソフトデリートしたデータを取得する方法は公式ドキュメントに記載されていますが、リレーション先のソフトデリートされたデータを取得する方法が書かれていませんでしたので、方法をメモしておきます。
Laravelでソフトデリートしたリレーション先のデータを取得する方法
テーブル構成
CustomerテーブルとCompanyテーブルがbelongsToでつながっているとします。
class Customer extends Model {
public function company() {
return $this->belongsTo('App\Company');
}
}
問題
Customerテーブルにソフトデリートされたデータが有る場合は、公式ドキュメントにもあるようにwithTrashed()を使えばソフトデリートされたデータを取得できます。
$customer = Customer::withTrashed()->first();
CustomerテーブルにリレーションしているCompanyテーブルのデータを取得するには、モデルで指定したcompanyを使用します。
echo $customer->company->address;
このときに、Company側にソフトデリートされたデータがある場合、データの取得ができません。このデータを取得する方法が公式ドキュメントには記載がされていません。
ちなみに、下のように記述しても正しく動作しません。
echo $customer->company->withTrashed()->address;
対処方法
こちらのサイトを参考にさせていただきました。(LALAVEL DAILY TEAM)
モデルのリレーション設定にwithTrashed()を記述します。
class Customer extends Model {
public function company() {
return $this->belongsTo('App\Company')->withTrashed();
}
}
コメント
この修正方法だと、該当するモデルを使用している箇所全てに影響が出てしまうので、
あまりいい例ではないのかなと思いました。