propel:
products:
_attributes: { phpName: Product }
id: ~
name: { type: VARCHAR, size: '40', required: true }
stock_count: { type: INTEGER, required: true }
price: { type: INTEGER, required: true }
class Product extends BaseProduct {
public function getStockValue() {
return $this->getStockCount() * $this->getPrice();
}
}Когда можно будет без лишних заморочек сделать
SELECT * FROM products ORDER BY getStockValue() — вот тогда-то и наступит рай земной, коммунизм и вендокапец. А пока, увы, всё с ORMами грустно.
no subject
Date: Wednesday, October 7th, 2009 05:31 pm (UTC)Ну, поехали.
Date: Wednesday, October 7th, 2009 08:46 pm (UTC)Панеслась.
Date: Thursday, October 8th, 2009 07:38 am (UTC)А если у нас таких вот функций стопицод, и все они уместны? Если, чёрт его дери, у меня действительно сложная логика, а я чайник и не знаю тонкостей SQLя и конкретной данной СУБД? Мне кажется, в таком случае ORM был бы действительно в тему.
Вдогонку.
Date: Thursday, October 8th, 2009 08:18 am (UTC)Вот пример: для Propel'а у меня есть класс Criteria, в который я могу некими неуклюжими методами напихать сравнения, примерно вот так:
$crit = new Criteria();
// ProductPeer::doSelect($crit) выполнит SELECT * FROM product
$a = $crit->getNewCriterion(ProductPeer::PRICE, 100, GREATER_THAN);
$b = $crit->getNewCriterion(ProductPeer::STOCK_COUNT, 10, LESS_EQUAL);
$a->addAnd($b);
$crit->add($a);
// ProductPeer::doSelect($crit) выполнит SELECT * FROM product WHERE (price>100) AND (stock_count<=10)
Вся суть этой неуклюжей Criteria — управляемость в контексте библиотеки ORMа. Это можно разложить на кусочки, которые можно транслировать в SQL. А ещё из этой фигни можно вытрясти что-то полезное (для ORMа) — ну там, список упоминающихся полей, например (если они вдруг понадобятся).
Вот если бы можно было разложить на token'ы уже существующую ф-цию, а потом эти token'ы выразить в SQL… Увы, это возможно только в тех языках, где код является данными; то есть тебе с Lisp'ом такое теоретически возможно, а в обычных языках — хрен там.
Re: Вдогонку.
Date: Thursday, October 8th, 2009 08:52 am (UTC)