1) Убрать логику из конструктора
2) В ларавеле разделены понятия шаблон и контроллер (как и везде наверное), это значит что надо передать данные в шаблон а потом уже выводить их через foreach
3) Как можно вообще писать такое?
$projects ?? ''
если предполагается что там должен быть массив то и там должен быть пустой массив а не пустая строка. В сишарпе же покруче вроде с типизацией....
4) Получение тегов. Project::with('tags') так можно получить сразу с отношениями. И не надо это все перебирать в массив, зачем если в шаблоне можно сразу получить то что надо и вывести.
5) При таком подходе к тегам если у проектов будут одинаковые теги то они будут добавлены 2-3-4 раза смотря в скольки проектах будет.
6) Получение 10 проектов с ID == 1? Точно Сишарп Программист?