Второе - не совсем по теме Eloquent'а. Он про магию, и тут скоупы приходятся к месту. А если нужны будут еще условия? Ну, допустим остаите первым вызов этого метода, а если нужны будут еще условия в виде методов? Вот для чего были созданы скоупы, так что первый вариант - однозначно лучше.
Далее:
Product::
под капотом как раз и делает
(new Product)->
, только кроме этого он может делать и что-то другое, о чем вы не знаете, поэтому я бы использовал Product:: хотя бы ради этого и какой никакой стандартизации.
Далее: почему бы не сделать
$user->products()->whereSlug($slug)
? Учитывая контекст, смею предположить что именно такой запрос вам нужен не так уж и часто, а значит это - неплохое решение. Нужен будет эктив - ну добавляете скоуп в модель Product и имеете счастье, типа
$user->products()->whereSlug($slug)->isActive()
. Последние два метода относятся к конечной модели Product, а значит их дублировать не нужно, а вот релейшены в разных моделях (
$user->products(), $page->products(), $something->products()
) - нужно, так что это правильный вариант.
Тем более, Product не должен быть ответственен за методы юзера (как в вашем втором варианте), а если туда напихать еще несколько от разных моделей, со всякими
$active = true
- получится каша.
TL;DR: Придерживайтесь того, что предлагает Eloquent, и будет вам счастье.