raw Builderを使用すると、eloquentを使用している場合は、テーブル名を削除してモデルインスタンスに置き換えるだけで以下を使用できます
DB::table(DB::raw('shop as s1'))
->join(
DB::raw('(SELECT article, MAX(price) AS price FROM shop GROUP BY article) as s2'),
function($query) {
$query->on('s1.article', '=', 's2.article')
->on('s1.price', '=', 's2.price');
})->get();