Как то всё запутанно у вас, перемешались кони и люди.
Вот что мне известно.
Вы в вопросе пишете
Дальше, получив данные из БД модель выполняет внутренний метод $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