Laravel4.2です。 5.x系はわかりません。
Laravelはクエリビルダー実行時に論理削除したレコード、つまりdeleted_atNULLのレコードを自動的に対象外にしてくれます。 joinしたテーブルを除いて…

論理削除したレコードを自動で除くというのはSQL的には下記のようなことです。
※Laravelでは(クラスの宣言次第で)deleted_atに値が入っていると論理削除とみなします。

参考

Laravel 4.2 Eloquent ORM

クエリビルダーを使用した場合にSQL実行時にLaravel側で下記のWHERE文を自動で付与してくれます。

1
WHERE deleted_at IS NULL;

つまり…製品の数を取得するSQLをクエリビルダーで書いたとすると…

1
2
3
DB::table('products')
->whereNull('deleted_at')
->count();

わざわざ->whereNull('deleted_at')を記述しなくても…

1
2
DB::table('products')
->count();

これだけでよいです…
フツーは…

joinのとき…

joinの時は joinしたテーブル はこれに 当てはまりません…

例えば、下記のような2016/8/1以降に注文のあった製品を取得したいとします。

1
2
3
4
5
DB::table('products')
->select('products.id', 'products.name')
->join('orders', 'products.id', '=', 'orders.products_id')
->where('orders.created_at','>', '2016-08-01')
;

しかし、この場合ordersテーブルの論理削除されたレコードは 取得対象に含まれてしまいます。
※productsテーブルの論理削除されたレコードは取得対象から除外されます。

従って、下記のように書く必要があります。

1
2
3
4
5
6
DB::table('products')
->select('products.id', 'products.name')
->join('orders', 'products.id', '=', 'orders.products_id')
->where('orders.created_at','>', '2016-08-01')
->whereNull(`orders.deleted_at`) //この一文が必要
;

フレームワークの特性を覚えるの大変…