Вопрос по ООП и реализации запросов к БД

e2site

Новичок
Всем добрый вечер, подскажите, а то уже глаз "замылился"

Есть 3 таблицы

User таблица
+----+-----+
| id | fio |
+----+-----+

Section таблица

+---+------+
|id | name |
+---+------+


User_in_Section таблица

+---------+------------+
| user_id | section_id |
+---------+------------+

Есть два класса

PHP:
class Section {
	$name;
	
	...
	function find_by_id($id) {
		Делаем запрос к таблице Section
	}
	...
}

class User {
	$fio;
	$sections = array();//Массив из объектов секция
	
	function get_section_list() {
		????
	}
}


Теперь к сути вопроса, мне надо заполнить $sections
Я могу сделать запрос к таблице User_in_Section, получить все section_id
И при помощи метода класса Section find_by_id получить нужные мне секции

PHP:
class User{
...
function get_section_list() {
	...
	$section = new Section();
	$section->find_by_id($section_id);
	$this->sections[] = $section;
	...
}
...
}
и это вроде бы правильно, но запросы к бд будут

select name from section where id=1
select name from section where id=2
..
select name from section where id=122


Логичней было бы выбрать сразу все объекты, но тогда мне придется внутри класса юзер делать это, а это уже не правильно, так как при изменении
в классе section мне придется вносить изменения и в класс user
Есть еще вариант создать класс прослойку, между section и user

Может кто забивал себе похожим голову, заранее спасибо.
 

fixxxer

К.О.
Партнер клуба
делаешь class SectionList
загружает все секции одним запросом
при запросе к конкретной секции (ну например SectionList implements Iterator,ArrayAccess) создаешь class Section сразу с нужными данными (инстансы можно кэшировать)

соответственно у Section неплохо иметь метод типа setAttributes(array $attrs), который дергается и внутренним findById и из SectionList

когда поймешь как это правильно сделать делаешь базовые абстрактные классы ItemModel и ListModel ;)
 
  • Like
Реакции: craz

Beavis

Banned
Только на этом пути будет такое количество костылей, что не сосчитать :)
Проще сразу изучить несколько популярных ORM-фреймворков, чтобы понять к чему всё это приведет в итоге, и решить - надо ли это или нет))
 

fixxxer

К.О.
Партнер клуба
Да ладно, никаких костылей, откуда? Все просто. В абстрактной реализации коллекции помимо описанного мной добавляется метод getItemInstance, и все. Остальное я уже написал. Где костыли?

Вот когда не научившись работать с базой ручками навешивают ормы, тогда как раз получаются костыли. От непонимания процессов.
 

Beavis

Banned
Да ладно, никаких костылей, откуда? Все просто.
Я имею ввиду что всё начинается с простого и понятного.
А потом, постепенно, начинает превращаться в подобие ORM-системы, и тогда уже "просто" не может быть в принципе.
 

fixxxer

К.О.
Партнер клуба
А нафиг тут не нужен никакой ORM. Максимум - простой query builder.

Как начнет обрастать - прекрасно, можно посмотреть как сделана та же доктрина (только не вторая упаси хоспади. первая!) и начинать пользоваться. Значит пришло время )
 

Beavis

Banned
А нафиг тут не нужен никакой ORM. Максимум - простой query builder.
ну пока не нужен, а потом начнут появляться many-to-many, и другие потребности, и всё обрастёт как новогодняя ёлка))

Как начнет обрастать - прекрасно, можно посмотреть как сделана та же доктрина (только не вторая упаси хоспади. первая!) и начинать пользоваться. Значит пришло время )
так я и говорю..) только проще сразу глянуть и решить, может и не надо свои костыли городить, а взять готовое и использовать
 

e2site

Новичок
Такой еще вопрос появился.

Если мне надо получить SectionList, где в каждом классе Section, есть UsersList(те кто входят в секцию)
То внутри класса SectionList надо либо для каждого элемента Section создавать класс UsersList, но тогда
у меня будет множество запросов, а не один SELECT section_name,user_name FROM sections,users WHERE section_id = x and user_section = section_id
Если я делаю все одним запросом, то мне надо в классе SectionList делать определения атрибутов для UsersList, но если мне надо будет внести изменение в Users класс, то мне придется тогда и менять в классе SectionList
Если же я буду внутри класса SectionList создавать UsersList и получать для каждого элемента свой список пользователей, то будет множество запросов.

Вообщем как мог объяснил, если не понято смогу подробней расписать.
 

WMix

герр M:)ller
Партнер клуба
может тебе просто метода не хватает?
PHP:
find_by_list($array)
 

e2site

Новичок
И что мне он даст мне в нем надо будет либо создавать
new UsersList();
Либо
делать запрос и добавлять все ручками, но тогда если мне надо будет поменять что то в классе Users, мне придется менять и в классе SectionList, собственно еще в верхнем сабже описал.
 

WMix

герр M:)ller
Партнер клуба
будет оба подхода, выбирай на вкус... один быстрый, один мощный.... мыж решили орм не тянуть, собирать масивы не хотим... упростили строго до нужд...
 

e2site

Новичок
В принципе можно конечно и так сделать, но класс будет Юзер дополнятся потом и ошибок много может быть из-за двух методов, в мощном забуду изменить запрос и будет попа. Так проще оставить большое кол-во запросов, вопрос больше на будущее.
 

Beavis

Banned
В классе SectionList сделай метод loadUserList
в этом методе одним запросом выбираешь все записи users для всех section, и потом их распределяешь по каждой section в этом sectionlist
 

WMix

герр M:)ller
Партнер клуба
В принципе можно конечно и так сделать, но класс будет Юзер дополнятся потом и ошибок много может быть из-за двух методов, в мощном забуду изменить запрос и будет попа. Так проще оставить большое кол-во запросов, вопрос больше на будущее.
а ты сделай один запрос, и дополняй его в обоих методах до нужд...
 
Сверху