Классы и пополнение БД

Whatsername

Новичок
Классы и пополнение БД

Я использую PHP4 для написания каталога изданий. Из пуристических соображений программу организую в виде классов и объектов.

На пальцах организация классов выглядит так:
Класс Media со свойствами author и title. Ему соответсвет таблица со столбцами: media_id, author и title. Media_id - AUTO INCREMENT.

Авторов на каждое издание может быть много. Есть класс Author со свойствами name и lastName.

Вопрос для меня заключается в следующем. Методы таких классов как Author должны знать media_id класса Media, чтобы корректно работать с его объектами. Но при создании нового объекта Media, media_id не всегда известен. (Например, до добавления объекта в БД (при создании нового наименования) объект создается, но в БД его записывает метод. Метод-то вызывается после создания объекта.) Таким образом media_id неизветен заранее. Как его грамотно установить?

Очевидно, что мой невнятный русский язык и отсутсвие опыта ООП сделали этот пост очень трудным для понимания. Но если кто-то может предложить грамотный подход - буду очень признателен.
 

Whatsername

Новичок
Автор оригинала: _RVK_
Не нужно создавать объекты до их добавления.
Спасибо. Чувствую, что в этом и кроется счастье =)

Но как тогда должен быть организован код?

Сейчас объект Media имеет метод record(), который записывает все свойства объекта в БД. Таким образом сперва создается объект, а потом он помещается в базу.
 

_RVK_

Новичок
Не знаю как должно быть но у меня так:
Есть объект=таблица например news_list
Есть объект=запись news

у news_list есть метод add($fields)

news_list сначала выполняет запрос на добавление, а потом создает объект и помещает его в массив childs. Вот и все.
 

Мутник

Новичок
а можно сначала создаьб с нуля объект, а потом все сохранить в БД. кому как удобнее.
 
Если в MySQL вызвать "show table status", то в столбце "Auto_increment" получим значение счетчика (т.е. ID автоинкрементного поля до его добавления).
 

Whatsername

Новичок
RVK, я скорее всего что-то не так понимаю, но получается, что у объекта нет методов работающих с базой данных. Так?

Полукондуктор, спасибо, это неплохой вариант.
 

_RVK_

Новичок
Whatsername

получается, что у объекта нет методов работающих с базой данных
Помимо метода add есть еще методы set, del, get... Не пойму почему ты сделал такой вывод.
 

Нечто

Психолог РНРClub
Whatsername
Поищи и почитай по кейворду ORM.
У большинства реализаций ORM есть простенькие примеры, из которых все станет ясно.
 

_RVK_

Новичок
Полукондуктор
Отдельное спасибо. Давече перерыл всю документацию в поисках аналога секвенций. :)
 

Whatsername

Новичок
Автор оригинала: _RVK_
Не пойму почему ты сделал такой вывод.
По незнанию.
Правильно ли я понял, что сперва ты заносишь данные в базу *без использования методов объектов,* а потом, на основании записей БД создаешь объект?
 

_RVK_

Новичок
Правильно ли я понял, что сперва ты заносишь данные в базу *без использования методов объектов,* а потом, на основании записей БД создаешь объект?
Объект не может сам себя занести или сам себя удалить. Это делает его "контейнер". В моем примере news_list. Вот именно его методы я и использую. В свою очередь news тоже может являться "контейнером" для других объектов.
 

Нечто

Психолог РНРClub
Другой вариант:
PHP:
// возвращаются (ссылки на) объекты класса Author
$author1 = $Authors->getByLastName('Пупкинс');
$author2 = $Authors->addAuthor('Кастрюлькин');

// возвращается (ссылки на) объект класса MediaObject
$newMedia = $Media->addMedia('PHP для пенсионеров');
$newMedia->addAuthor($author1);
$newMedia->addAuthor($author2);
Здесь все идет без транзакций, база обновляется/запрашивается одновременно с созданием объекта. У каждого объекта есть метод getID(), который позволяет другим объектам связывать его с собой.
 

Whatsername

Новичок
_RVK_,
я тебя не понимаю, но все равно тебе спасибо. =)
Нечто,
спасибо, почитаю.

Update:
Нечто, запостил не видя твоего сообщения. Спасибо.
 

Нечто

Психолог РНРClub
_RVK_
При создании объекта материнским объектом-фабрикой ("контейнером"), если ID указывается явно, то это - get, иначе - add. В последнем случае объект сам создается с указанными в конструкторе обязательными полями и дефолтовым набором параметров. Таким образом, свой ID он знает всегда. Это позволяет другим объектам, получившим ссылку на тот объект, узнать его ID и занести к себе в таблицы-связки.
 

Whatsername

Новичок
Нечто,
так откуда же объект *при создании* узнает ID если не передавать его конструктору? Без метода add() (или set(), или record()) - никак. Но метод добавления в БД вызывается лишь при добавлении объекта в БД.
 

Нечто

Психолог РНРClub
Whatsername
так откуда же объект *при создании* узнает ID если не передавать его конструктору?
В том-то и дело, что если ID не передан, то соответствующая запись в базе сразу создается, и уже впоследствии обновляется, если есть какие-то опциональные параметры или связи.
Короче, mysql_insert_id() и вперед.
 

Whatsername

Новичок
В таком случае, вместо параметра ID конструктора класса следует передавать NULL - свидетельство создания записи. После чего переписывать свойство ID объекта согласно записи в таблице. Я правильно тебя понял?
 
Сверху