Login | Register
My pages Projects Community openCollabNet

propel
Reply to message

* = Required fields
* Subject
* Body
Attachments
Send reply to
Topic
Author (directly in email)
Please type the letters in the image above.

Original message

Author Ants Aasma <ants.aasma@gmail.com>
Full name Ants Aasma <ants.aasma@gmail.com>
Date 2006-05-31 04:06:51 PDT
Message Hi,

I looked at the examples you provided. The SqlExpr class seems a bit
evil to me, as it leaks the database independence abstraction. I don't
think it should be completely eliminated, but I do think its use
should be heavily discouraged. Propel should provide a way to abstract
the more frequently used expressions and provide a way to build plug
in custom expressions so that the database dependent code goes into a
well defined place. This will probably bring up the need for the
criteria interface to be a bit more datatype aware.

So the example
$c = AuthorPeer::getCriteria();
$c->add(new SqlExpr("char_length(name) = 4"));

could be something like:
$c->add(new EqualExpr(StringFiel​d::LengthExpr(Author​Peer::FIRST_NAME), 4));

or:
$c->add(new EqualExpr(AuthorPeer​::FIRST_NAME()->l​ength(), 4));

or going the fluent API way:
$c->add(AuthorPe​er::FIRST_NAME()-​>length()->equals​(4));

Even with the fluent API, the Criteria design can remain basically the
same, only adding the convenience factory methods.

By using this kind of SQL abstraction we could easily add commonly
used abstract datatypes, such as timeperiod or money, and maybe even
transparently support the Embedded Value (
http://www.martinfow​ler.com/eaaCatalog/e​mbeddedValue.html ) pattern.
This would shift propel a bit into the Data Mapper territory, but
would make it a lot more suitable as a basis for a cleanly factored
Domain Model.

I still have to think a bit, how could we fit subqueries into the
Criteria picture. It would be really sweet, if we could get something
like this working:
$c = HotelroomPeer::creat​eCriteria();
$c->add( HotelroomPeer::RESER​VATIONS()->notAny​(
ResevationPeer::TIME​PERIOD()->interse​cts( $conference->getTimeperiod()
) ) );
$freeRooms = HotelroomPeer::doSelect( $c );

The best part about the fluent interface would be that if we document
everything appropriately IDE's will autocomplete all of this.

Ants Aasma

PS: Don't think that I'm ignoring you if I don't reply swiftly - I'm
just having connectivity problems. The germans seem to have
ridiculously expensive Wifi access. 30mins of wifi in my hotel costs
the same as two beers from the minibar. Fortunately bundesdruckerei
has hooked me up with free wiki at the conference center.