Hi Davey,
Thanks so much for your enthusiasm. I think you misunderstood the
intent of my email. The code in the DbTable-09 branch is the
implementation that will be used in the ZF 1.0 release. If you
want to
develop your ActiveRecord prototype for Zend, please write a formal
proposal in our wiki format and it will go through the usual review
process. Some of your work may be approved for inclusion in a future
release of Zend Framework. The formal proposal template can be
found at
the following URL:
http://framework.zend.com/wiki/display/ZFPROP/Home
Bill Karwin
-----Original Message-----
From: Davey Shafik [mailto:[EMAIL PROTECTED]
Sent: Wednesday, March 07, 2007 3:15 AM
To: Bill Karwin
Cc: Zend Framework
Subject: Re: [fw-general] ActiveRecord patch
Bill,
First off, thank you for such a detailed comparison, this is great!!
I'll go through your list and say what I would like to bring to
Zend_Db_ActiveRecord,
and maybe we can move some of your work over and therefore have the
name people expect
and provide a good implementation :)
The implementation in the branch:
- The find() method always returns a Rowset object (see ZF-21).
Good
because it's easy to call exists() after find().
I agree on the Row Vs Rowset, I never *really* liked it :)
- Supports multi-column primary keys.
Honestly, I've never used this, so I missed this from AR, would love
to see it moved in
- No usage of inflectors.
We could allow both?
- No object vars for searching.
I could easily add a cleanup method, or perhaps you could pass a Row
with the
vars to find() ? I think both would be good :)
- Supports any number of custom Row and Rowset classes per Table
class.
Great, I'd like to see this, but automated use of ARClass_Row(Set)
would be
great too
- Supports queries against related tables, e.g. parent table,
dependent
table, many-to-many table. All queries support multi-column keys.
Obvously needs adding
- Table class supports custom _insert(), _update(), _delete()
filtering.
I'm not sure what this would be used for, but lets bring it over :)
- Table relationship query methods can be either magic or non-magic
(non-magic is useful for tool support).
This would be good too
Your patch has a lot of good ideas, but there are some places where
you
and I disagree:
- I don't think the find() method should return two different class
types depending on the arguments.
Agreed
- I don't care for inflectors, or any manipulation of SQL
identifiers.
The use is minimal, lets remove it :)
- I prefer declaration of metadata, instead of imposing schema
conventions on developers. There are plenty of frameworks that
impose
conventions, which is great for new projects where the developer
has the
freedom to design the database schema. But Zend_Db could gain a
very
valuable differentiator if it works with an existing database
schema.
I already have plans for this, and I agree, it should be possible to
*easily*
wrap AR around an existing table that doesn't conform to our "norm",
and
as I mentioned elsewhere, the way I would like to do this, is
aliasing, that
allows your tables to have a consistent AR API regardless of the
actual
schema beneath.
This is very important to me, actually, that the AR whilst it has a
lot of
voodoo, should be easily overridden internally, and still provide
the same API when used.
- Davey
On Mar 7, 2007, at 4:13 AM, Bill Karwin wrote:
Hi Davey,
I took a good look at your patch for a prototype ActiveRecord
implementation.
You might want to take a look at the implementation currently in
branch
"DbTable-09". I just committed a doc section for it today:
http://framework.zend.com/fisheye/browse/~raw,r=3781/Zend_Framework/
bran
ch/DbTable-09/documentation/manual/en/module_specs/Zend_Db_Table-
Relatio
nships.xml
The implementation currently in the branch actually shares a lot of
features with your implementation. Here are some differences (not
necessarily a complete list):
Your implementation:
- find() method returns a Row or Rowset object, depending on
whether you
give 1 arg or > 1 arg.
- findAll() and findFirst() methods support Boolean operators for
combining the array of where conditions.
- Supports a single custom Row and Rowset class per ActiveRecord
class,
custom Row and Rowset classnames must be based on ActiveRecord
classname.
- Primary keys limited to a single column.
- Supports object vars for searching (how does one reset the object
vars
back to an initial state?)
- "Roll back" (i.e. reset) Row members to clean data.
- Supports custom methods in Row per column, for filtering values
during
__set().
- Uses inflectors to pluralize/singularize during the table
relationships query methods.
The implementation in the branch:
- The find() method always returns a Rowset object (see ZF-21).
Good
because it's easy to call exists() after find().
- Supports multi-column primary keys.
- No usage of inflectors.
- No object vars for searching.
- Supports any number of custom Row and Rowset classes per Table
class.
- Supports queries against related tables, e.g. parent table,
dependent
table, many-to-many table. All queries support multi-column keys.
- Table class supports custom _insert(), _update(), _delete()
filtering.
- Table relationship query methods can be either magic or non-magic
(non-magic is useful for tool support).
Your patch has a lot of good ideas, but there are some places where
you
and I disagree:
- I don't think the find() method should return two different class
types depending on the arguments.
- I don't care for inflectors, or any manipulation of SQL
identifiers.
You get into trouble if your database contains both spellings, e.g.
Dog
and Dogs. Or if the RDBMS uses case-sensitive identifiers, but the
framework is trying to apply camelcasing. The only safe thing to
do is
to use the spelling of SQL identifiers that the RDBMS uses.
- I prefer declaration of metadata, instead of imposing schema
conventions on developers. There are plenty of frameworks that
impose
conventions, which is great for new projects where the developer
has the
freedom to design the database schema. But Zend_Db could gain a
very
valuable differentiator if it works with an existing database
schema.
Regards,
Bill Karwin
-----Original Message-----
From: Davey Shafik [mailto:[EMAIL PROTECTED]
Sent: Tuesday, March 06, 2007 1:05 AM
To: Bill Karwin
Cc: Zend Framework
Subject: Re: [fw-general] Zend Framework 0.9 code freeze schedule
Bill,
Yes, I did look at the proposals. I have also done as promised and
written a fully fledged ORM :)
I have attached the files, they will unpack directly in the folder
they are in, and should be placed
in incubator/Zend/Db/
The ORM features as follows:
* Inflection based config, i.e. class Dogs extends
Zend_Db_ActiveRecord { } == table "dogs"
* Advanced "Find" methods:
- find($id)
- find($id, $id2, $id*)
- $obj->id = $id; $obj->find(); $obj->name = "foo";
$obj->find();
- findAll(array('column' => 'value'), (AND|OR))
- $obj->name = "bar"; $obj->findAll();
- findFirst(...) - same as findAll() but only returns a single
row
* Ability to override _setUp() method to customize table name and
PK
column name (i.e. not inflection/reflection based)
* Smart save() method will UPDATE or iNSERT as needed.
* Ability to use 1:1 and 1:MANY relationships
- $row->getFoo() = 1:1 using class "Foos"
- $row->getAllFoos() = 1:MANY using class "Foos"
* Ability to filter data when setting on the record, by doing:
class Foos_Row extends Zend_Db_ActiveRecord_Row {
function name($value)
{
return ucwords($value);
}
}
$foos_row_instance->name = "davey shafik"; // will save as
"Davey
Shafik"
* Ability to rollback to the original row data, or to last save()
call
$row->rollback();
* Duplicate rows using:
$duplicate = clone $original;
$duplicate->save();
And all this in just 584 LOC (including comments and whitespace :)
The only thing I would like to add, is the ability to pre-fetch
relationships using JOINs by setting
an option and looking for $this->*_id - then the getFoo() and
getAllFoos() would just use the already
fetched data.
There is an ActiveRecordExample.php in the zip file, and I also
attached a SQL dump of the DB I'm using
- Davey