LaravelのSoftDeletingTraitは非常に便利なのですが、
適用範囲はQueryBuilderを発行する基となるクラスです。
つまり、join/leftJoin/rightJoinで結合した先の論理削除条件は
自動ではセットされません。
そこで、例えばこんな感じになります。
Product::where('products.type_id', 1)
->leftJoin('options', function ($join) {
$join->on('products.id', '=', 'options.product_id')
->whereNull('options.deleted_at');
})
->select('products.name as product_name', 'options.name as option_name')
->get();
基本的にはeager loadingすれば良いと思うのですが、
joinする場合は気を付けた方が良いですね。