В Doctrine DQL конструкции реализованы также в API. Так что самим "DQL" можно и не пользоватьсяАвтор оригинала: atv
Гибкость доктрины опирается на DQL, которое позволяет получать практически всё многообразие выборок языка SQL.
Я считаю, что мне удалось достичь такой же гибкости без использования DQL, благодаря API библиотеки. Конечно, возможно, я ещё не всё учёл, практика покажет.
Код взят из примеровА то лайторм то, наверное, используется максимально оптимально...
Код взят из примеров с офф. сайтаа насчет доктрины у меня есть сомнения
$conn = Doctrine_Manager::connection('mysql://root:@localhost/orm');
class Seller extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('sellers');
$this->hasColumn('seller_id as id', 'integer', null, array('primary' => true, 'autoincrement' => true));
$this->hasColumn('seller_name as name', 'string', 30);
}
public function setUp()
{
$this->hasMany('Order', array('local' => 'seller_id', 'foreign' => 'seller_id'));
}
}
class Customer extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('customers');
$this->hasColumn('customer_id as id', 'integer', null, array('primary' => true, 'autoincrement' => true));
$this->hasColumn('customer_name as name', 'string', 30);
}
public function setUp()
{
$this->hasMany('Order', array('local' => 'customer_id', 'foreign' => 'customer_id'));
}
}
class Order extends Doctrine_Record
{
public function setTableDefinition()
{
$this->setTableName('orders');
$this->hasColumn('order_id as id', 'integer', null, array('primary' => true, 'autoincrement' => true));
$this->hasColumn('order_sum as sum', 'integer');
$this->hasColumn('seller_id as sellerId', 'integer');
$this->hasColumn('customer_id as customerId', 'integer');
}
public function setUp()
{
$this->hasOne('Seller', array('local' => 'seller_id', 'foreign' => 'seller_id'));
$this->hasOne('Customer', array('local' => 'customer_id', 'foreign' => 'customer_id'));
}
}
Я за! Не буду пользоватьсяВ Doctrine DQL конструкции реализованы также в API. Так что самим "DQL" можно и не пользоваться
$q = new Doctrine_Query();
$q->select('q.*, count(si.word) as nb, sum(si.weight) as total_weight')
->from('Question q')
->innerJoin('q.SearchIndex si')
->whereIn('si.word', array('test1'))
->groupby('si.question_id')
->orderby('nb desc, total_weight desc');
$q->having('nb = ?',2);
Какие будут предложения? Как доктрине сказать, чтоб она не создавала отдельную транзакцию?В тестах LightORM insert/update идет внутри одной транзакции.
В Doctrine каждый insert/update создает свою транзакцию.
Я не проверял, что появилась более новая. Попробую новую.1) почему доктрина версии 0.9, когда есть 0.10.2 ?
Потому что у LightOrm есть только такой режим, к тому же, он выполняется двумя запросами, что предположительно хуже. Можно отдельно сравнить ещё и с loadRelated, но такого режима нет у Propel.2) почему лайтормовский bulkLoad находится в секции join selecting?
Разве они не стартуются автоматически.3) почему для лайторма стартуются транзакции, а для остальных нет?
В LightOrm тоже можно удалить одним запросом, но что в этом случае сравнивать? Скорость MySQL?Также весь delete код для доктрины достаточно заменить на: $conn->getTable('Order')->findAll()->delete();
В этом случае всем будет лучше, и LightOrm и Propel.Также есть подозрение, что если определить в связях 'onDelete' => 'CASCADE', то будет еще лучше, т.к. доктрине не нужно будет обрабатывать связи самой.
Можно, используя метод Collection::getItemsByQuery() и квери билдер SqlQuery. (Писать пример сейчас нет времени, я на работе)А можно такие запросы делать с помощью LightORM?
Надо запустить транзакцию в начале.Автор оригинала: atv
Какие будут предложения? Как доктрине сказать, чтоб она не создавала отдельную транзакцию?
Ок. Позже выложу результат.Надо запустить транзакцию в начале.
// initalize a new Doctrine_Connection
$conn = Doctrine_Manager::connection($dsn);
// !! no actual database connection yet !!
Да, не учёл. Но это сказалось только на тесте insert'а, да и то, на фоне вставки 3000 связанных объектов, время подключения дало небольшую погрешность.// !! no actual database connection yet !!
Ну, на LightOrm я то смотрел, когда оптимизировал . Да и на Propel поглядывал. По select'ам в Propel'е вытянули всё что могли, с учётом ещё и того, что она генерируемая. Так что скорость Propel'а по select'ам остаётся недосягаемой для негенерируемых ОРМ.вообще было бы прикольно посмотреть на тесты под микроскопом Xdebug'а
class Seller extends BaseSeller
{
public static $instances = 0;
public function __destruct()
{
self::$instances--;
}
public function __clone()
{
self::$instances++;
}
public function __construct($table = null, $isNewEntry = false) {
self::$instances++;
Doctrine_Record::__construct($table, $isNewEntry);
}
}
print Customer::$instances."/".Seller::$instances."/".Order::$instances."\n";
$orders = Doctrine_Query::create()
->from('Order o')
->leftJoin('o.Seller s')
->execute();
foreach ($orders as $order) {
$sum = $order->sum;
$name = $order->Seller->name;
$order->free(true);
}
unset($order);
$conn->getTable('Order')->clear();
print Customer::$instances."/".Seller::$instances."/".Order::$instances."\n";
unset($orders);
print Customer::$instances."/".Seller::$instances."/".Order::$instances."\n";
0/0/0
0/0/1000
0/0/0
Забыл еще спросить... а если по какой-то причине (да-да, наш мир не идеален) запрос с лимитом по трудоёмкости получается почти такой же, как без оного, не помрет ли база из-за увеличившегося числа таких тяжелых запросов?Можно поподробнее? Это делается множественными запросами с limit'ом, или как?Плюс к этому, есть буферизация, т.е. когда делаеш итерацию по таблице, в которой 10000 записей, то не беспокоишься о памяти, так как выборки происходят порциями, в зависимости от размера буфера.
Да, я не догадался ещё и $orders ансетить.Не знаю чо еще добавить...
Всё может быть. А какие есть варианты? В принципе, размер буфера можно менять, вплоть до того, что совсем отключить.не помрет ли база из-за увеличившегося числа таких тяжелых запросов
30 мегабайт на процесс, 100 параллельных процессов...Кстати, в этой коротенькой статье доходчиво объясняется, как перерасход памяти сказывается на производительности, и почему так важно стремиться уменьшить её расход.
Это что за бред? Выдача статики на несколько порядков быстрее чем выполнение скриптов, по этому обычно стараются чтобы максимальное количество запросов приходилось на статику чтобы снизить нагрузки на сервера. Для этого применяются кеширования, предгенерация статический версий страниц, и специализированные легкие сервера типа nginx.Проблема выдачи статического контента настолько существенна, что одной из важнейших задач является минимизация числа статических запросов, обрабатываемых веб-сервером.
$u1 = $users -> findFirst ();
$u2 = $users -> findFirst ();
Читаем, читаем , болел я просто...Hе читаем или ветку создать?
Точнее, это будет один объект, на который будет несколько объектов декораторов, с помощью которых, собственно, и находиться механизм подсчёта ссылок. Но это технические детали, внешне всё выглядит так, как будто имеешь несколько ссылок на объект.Дык вот собственно и вопрос: будут ли все объекты идиентичными?
Поскольку имеется только один объект, а остальные ссылаются на него, то уже до сохранения свойство будет возвращать новое значение.Поменяется ли это свойство во всех остальных объектах
до сохранения? После сохранения?