Вопрос: Что такое модель в ООП в веб?

Лучший ответ:
Контроллер, представление, модель - это элементы MVC, к ООП отношения не имеют.
Контроллер получает от пользователя запрос в определенном виде (запрос браузера, обращение к API, команда, все это разные группы контроллеров). Распарсив запрос передает его в модель для обработки.
Модель содержит бизнес-логику, т.е. по-сути то, что должно делать ваше приложение, без привязки к способам обращения пользователей и способам вывода. Возможно будут вызываться модели работающие с БД, а может и не будут, это неважно, не превозносите БД как сверхсущность, это обычный инструмент, один из множества.
Далее модель передает подготовленные для вывода данные в контроллер (в классической MVC сразу в представление), и контроллер передает их в нужное представление.
Вот и все, простая схема, которая позволит отделить мух от котлет, создавать API, видоизменять вывод, не трогая основную логику. А работа с БД, совсем другой вопрос.

Худший ответ:
Как то всё запутанно у вас, перемешались кони и люди.
Вот что мне известно.
Вы в вопросе пишете
Дальше, получив данные из БД модель выполняет внутренний метод $this->createObject(), который создает из полученных данных из БД объект UserEntity и вставляет в него те поля, которые у нее есть (все остальные указаны по умолчанию в объекте UserEntity). Ну вот собственно и вся ее работа. НО во многих комментариях я вижу сообщения по типу: "модель не должна лезть в БД". Но тогда кто в нее должен лезть? 
Вы ни разу не упомянули про репозиторий, его так не хватает в вашем монологе.
Терминология.Модель - это некоторый объект, имеющий поля, геттеры и сеттеры - то,  это место куда мы помещаем данные и только их.Сущность - Entity и имеет особые отношения с вашей базой данных - обычно каждый экземпляр сущности соответствует отдельной строке. В doctrine orm модель может быть описана в аннотации.Репозиторий - класс, соответствующий классу Entity и содержащий методы типа getById, getMyHome, ...
Теперь имея некое представление
Если модель, э всего лишь объект, которые хранит некоторые значения, а сущность может быть классом, или аннотацией, которая описывает отношения и типы полей. Модель это всего лишь класс  с геттерами и сеттерами
То репозиторий над моделью и сущностью, да простит меня всевышний.
Именно в репозитории вы описываете, то как вы будите тянуть ваши данные из базы и в итоге вы получите данные которые будут в расположены в модели.
Вот некоторые примеры:
Метод в репозитории/**
     * @param int $id
     * @return mixed
     * @throws NonUniqueResultException
     * @throws NoResultException
     */
    public function getById(int $id) {
        return  $this->createQueryBuilder("org")
            ->leftJoin("org.category", "cat")
            ->leftJoin("org.region", "region")->addSelect("region")
            ->leftJoin("org.country", "country")->addSelect("country")
            ->leftJoin("org.city", "city")->addSelect("city")
            ->leftJoin("org.street", "street")->addSelect("street")
            ->leftJoin("org.gps", "gps")->addSelect("gps")
            ->leftJoin("org.services", "services")->addSelect("services")
            ->leftJoin("services.group", "grp")->addSelect("grp")
            ->leftJoin("org.images", "images", "", "")->addSelect("images")
            ->leftJoin("org.reviews", "reviews", Join::WITH, "reviews.status = 1")->addSelect("reviews")
            ->where("org = :id")->setParameter("id", $id)
            ->getQuery()
            ->getSingleResult();
    }
Из примера выше, мы может определить, какие модели буду заполнены.
А вот пример, то как я тяну данные в контроллере, используя репозиторий/**
     * @Rest\Route(
     *     path="/organization.getById",
     *     name="organization_get_by_id",
     *     requirements={ "id"="\d+" }
     * )
     *
     * @param Request $request
     * @return object|JsonResponse
     * @throws ExceptionInterface
     * @throws NonUniqueResultException
     * @throws NoResultException
     */
    public function getById(Request $request)
    {
        $organization_repository = $this->getDoctrine()->getManager()->getRepository("App:Organization");

        $rs = new ResponseSchemaData();
        $rs->setData($organization_repository->getById($request->get("id")));

        $serializer = $this->get('serializer');
        $response_object = $serializer->normalize($rs, "json", ["attributes" => [
            "code",
            "data" => [
                "id",
                "name",
                "images",
                "description",
                "postCode",
                "phone",
                "email",
                "home",
                "site",
                "schedule",
                "images",
                "rating",
                "gps" => [
                    "latitude",
                    "longitude",
                ],
                "category" => [
                    "id",
                    "name",
                ],
                "reviews" => [
                    "id",
                    "author",
                    "text",
                    "likes",
                    "dislike",
                    "rating",
                    "createAt",
                ],
                "services" => [
                    "id",
                    "name",
                    "types" => [
                        "id",
                        "name"
                    ]
                ],
                "country" => [
                    "id",
                    "name"
                ],
                "region" => [
                    "id",
                    "name"
                ],
                "city" => [
                    "id",
                    "name"
                ],
                "street" => [
                    "id",
                    "name",
                    "streetType"
                ],
            ]
        ]]);

        return new JsonResponse($response_object);
    }
В итоге, если я сериальную объект в json, то у меня получится нечто{
    "data": {
        "name": "Здравстолет",
        "home": "51",
        "phone": "8 (800) 350-29-32",
        "site": "https://zdravstolet.ru/",
        "schedule": "пн–пт 08:00–17:00",
        "id": "641659",
        "category": [],
        "city": {
            "id": 3170,
            "name": "Бийск"
        },
        "street": {
            "name": "Петра Мерлина",
            "id": 19583,
            "street_type": "улица"
        },
        "country": {
            "name": "Россия",
            "id": 3159
        },
        "reviews": [
            {
                "author": "пиаипиапи",
                "text": "иапипиаиапипаипаиапи",
                "likes": 0,
                "dislike": 0,
                "id": "41",
                "rating": 0,
                "create_at": "2019-09-22T20:03:42+00:00"
            }
        ],
        "description": null,
        "email": null,
        "rating": "3.7",
        "services": [],
        "images": [],
        "post_code": 659303,
        "region": null,
        "gps": {
            "latitude": 52.529974,
            "longitude": 85.173845
        }
    },
    "code": 0
}
Каждый объект в JSON это 1 таблица в базе данных.
Или скажем так:
1 объект = 1 таблица = 1 модель 
Сущность = таблица
Да простит меня господь за грехи мои.
ORM