Я пытаюсь избежать DRY в моем построителе запросов, в частности, о добавлении дополнительного метода в цепочку.eloquent - динамический и условный whereHas() в построителе запросов
Пример, это изначально строитель запрос, который у меня есть:
$products = $app->myShop->realProducts()
->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
Затем, если пользователь использовал некоторые фильтры, мне нужно добавить метод (в частности, whereHas()
) к построитель запросов
$products = $app->myShop->realProducts()
->where($query)
->whereHas('colour', function ($q) use ($find) {
$q->where('colour_slug', $find);
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
Я считаю, что «некрасиво», что для достижения этого результата, я должен повторять тот строитель запрос:
if ($user_filtered_this_page == TRUE) {
$products = $app->myShop->realProducts()->where($query)
->whereHas('colour', function ($q) use ($find) {
$q->where('colour_slug', $find);
})
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
} else {
$products = $app->myShop->realProducts()->where($query)
->skip($skip)->take($take)
->orderBy($sortKey, $sortOrder)
->get();
}
Есть ли более умный или элегантный способ динамически и условно добавить метод whereHas()
в цепочку?
Надеюсь, кто-то может помочь. Спасибо!
я думаю, что это не даст желаемого результата, так как он будет пропускать 'realProducts()' 'без colour' отношения. –