Выбор между ORM-файлами Symfony для Model.class.php и ModelTable.class.php
Когда доктрина строит файлы моделей для таблицы, она генерирует три файла, по существу BaseModel.class.php
, Model.class.php
а также ModelTable.class.php
, Общеизвестно, что любые изменения должны быть сделаны для Model.class.php
или же ModelTable.class.php
против BaseModel.class.php
,
Но когда вы выбираете между Model.class.php
против ModelTable.class.php
, Насколько я понимаю, Model.class.php предназначен для одного экземпляра, а ModelTable.class.php для нескольких экземпляров.
Кто-нибудь может пролить свет здесь?
3 ответа
Это так просто!
Предположим, у вас есть статья под названием Model. у вас будет три класса с именами BaseArticle.class.php и Article.class.php и ArticleTable.class.php
вот определение для каждого класса:
BaseArticle.class.php: у этого класса есть определение вашей модели (или определение вашей таблицы). Вы не хотите редактировать этот класс когда-либо!
Article.class.php: это место для ваших методов переопределения, которые вы можете написать для своих моделей. у вас есть доступ к этим функциям, только если у вас есть экземпляр класса Article. так что вы можете вызывать их только по объекту. например:
class Album extends BaseArticle {
public function getSummary(){
....
}
}
для его использования вы должны сделать это:
$article=new Article();
$article->getSummary();
ArticleTable.class.php: и именно здесь вы хотите написать свои функции, которые относятся ко всей статье Article (или лучше сказать для всей модели Article). Например, если вы хотите найти самые популярные статьи, вы не можете написать эту функцию в свой Class Article, потому что она работает только с объектом. но вы хотите сделать это на всей вашей таблице. так:
class AlbumTable extends Doctrine_Table {
public static function getPopularArticles() {
}
}
и вы должны использовать это так, если ваши функции статичны:
ArticleTable::getPopularArticles();
и если ваши функции не являются статичными, вы можете вызвать их, используя:
Doctrine_Core::getTable('Product')->your_nonstatic_function();
Ответ J0k информативен, но на самом деле не отвечает на вопрос с точки зрения непрофессионала. Особенно относительно одного или нескольких вопросов.
Разница на самом деле не единичная или множественная, а скорее единичная, а не единичная.
Очень просто:
Вы используете функции Table, когда у вас еще нет экземпляра объекта, который вы хотите прочитать или манипулировать им.
Вы используете функции класса, когда у вас уже есть экземпляр объекта, и вы хотите сохранить его, обновить его или получить дополнительную информацию (связанные объекты) о нем.
Часто табличные функции доступны из функций класса
Сложнее:
Зачастую при хорошем дизайне вам необходимо создавать методы как в обычных методах Class, так и в методах Table.
Скажем, у вас есть клиент, имеющий отношение один к многим с покупками (который имеет отношение один к многим к продуктам)
Скажем, вы хотите написать метод или получить все продукты Клиента.
в Customer.class.php вы создаете:
public function getProducts(){}
вы создаете это в обычном классе, потому что вы будете интересоваться, какие продукты у клиента, только когда у вас есть ваш клиент
это может вызвать что-то вроде:
Doctrine_Core::getTable('Product')->getByCustomerId($this->get('id')
Здесь, возможно, у вас еще нет экземпляров Product, но вы хотите их получить, поэтому это следует сделать в классе Table.
Причина, по которой это не просто разбивается на "Один против нескольких", заключается в следующем: если вы должны были сделать функцию, которая возвращает все Продукты, принадлежащие Клиенту. Возможно, вы имеете дело с несколькими продуктами, но не хотите создавать свою функциональность только в таблице. Вам может потребоваться позвонить через API вашему обработчику платежей, вам может понадобиться проверить период возврата по каждому продукту, ETC.
Вместо этого вы создаете табличные функции для получения нужных данных, а затем манипулируете этими данными, создавая классовые функции.
Обратите внимание, что я вижу, что хорошие программисты все время ошибаются. Это часто сводится к вопросу индивидуального стиля.
Вы найдете очень хороший ответ в официальной документации, в классах моделей.
В основном о Model.class.php
:
Model
это объект класса, представляющий запись в базе данных. Они дают доступ к столбцам записи и связанным записям. Это означает, что вы сможете узнать название модели, вызвав методModel
объект.
За ModelTable.class.php
:
ModelTable
Являются ли стол классической; то есть класс, содержащий открытые методы для работы с таблицами. Они предоставляют способ извлечения записей из таблиц. Их методы обычно возвращают объект или коллекцию объектов класса связанных объектов
А также BaseModel.class.php
:
Base
классы хранятся вlib/model/doctrine/base/
директории - это те, которые напрямую генерируются из схемы. Вы никогда не должны изменять их, так как каждая новая сборка модели будет полностью стирать эти файлы.