[PHP]O/R Mappers

Pagina: 1
Acties:
  • 137 views sinds 30-01-2008
  • Reageer

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Af en toe maak ik wel eens wat kleine sites in PHP(4). Voor mijn werk doe ik veel meer met .NET en een klein beetje met Java.

Nou heb je voor .NET en Java een groot aantal frameworks die de koppeling tussen je Object model en je Database een stuk makkelijker kunnen maken. Niemand heeft er natuurlijk zin in om als een tiep miep voor al je classes zo'n beetje de zelfde code te gaan typen om ze te kunnen selecten/updaten/deleten.

In .NET en Java gebruik je dan bijvoorbeeld (n)Hibernate.

Ik zou ook graag zoiets voor PHP hebben maar heb nog niet echt iets kunnen vinden wat aan mijn wensen voldoet. Het gene wat ik gevonden heb wat er het meeste op lijkt is Propel maar dat is er alleen voor PHP 5.
Er is ook nog zoiets als PEAR::DB_DataObject maar dat lijkt niet echt goed gedocumenteerd te zijn.

Het lijkt me toch dat er wel meer mensen zijn die er niet van houden om telkens weer dataaccess classes te typen. Dus mijn vraag is: Wie maakt er wel eens gebruik van een O/R Mapper in PHP en wat zijn daar je ervaringen mee?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ik gebruik Propel. Als het moet zelfs voor PHP4. Want er is dus wel een propel runtime voor PHP4 van versie 1.1.1. De versie die je met een beetje zoeken wel in SVN kunt terugvinden gooit alleen met bergen Notices vanaf PHP 4.4.x. Als je geinteresseerd bent, heb ik wel customized versies van de laatste Propel PHP4 runtime en Creole PHP4 voor je voor PHP 4.4.x.

Overigens ben ik voor een deel al weer afgestapt van Propel. Te bloated imo voor de meeste doelen van PHP. Het is dat het nogal geintegreerd is is m'n CMS classes (bad..bad!), anders had ik het al een tijdje overboord gegooid. Ik vind ActiveRecord veel fijner...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Hmm ActiveRecord had ik ook voorbij zien komen ja. Daar zal ik ook nog eens naar kijken. Ik ben eigenlijk op zoek naar een applicatie die aan de hand van mijn database en eventueel een config file gewoon een complete data access layer genereert zodat ik niet meer naar de database om hoef te kijken. Hierbij wil ik ook graag ondersteuning voor dingen als Relaties en Inheritance.

Wat ik van Propel gezien heb is het echt een benadering vanuit de database gezien ( Maar dat kan ik mis hebben hoor ). Ik wil mijn database eigenlijk alleen gebruiken als opslag van mijn objecten en daar wil ik niks meer van terug zien in mijn applicatie logica

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ik weet niet wat je precies bedoelt met 'vanuit de database gezien'. Propel gebruikt een XML schema (geen Schema) voor het genereren van zowel de OM classes als de bijbehorende SQL code. Wat eventueel ook kan is het reverse engineeren van een database naar een XML schema. Voorbeeld van zo'n XML schema:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<!DOCTYPE database SYSTEM "../dtd/database.dtd">

<database package="tv.masmedia.model" name="masmedia" defaultIdMethod="native">
        
    <table  name        =   "masmedia_node" 
            phpName     =   "Node" 
            idMethod    =   "native" 
            baseClass   =   "nl.shapers.tree2.model.BaseNodeObject" 
            basePeer    =   "nl.shapers.tree2.model.BaseNodeObjectPeer">
        
        <column
            name="id"
            required="true"
            primaryKey="true"
            autoIncrement="true"
            type="INTEGER"
        />
        <column
            name="lft"
            type="INTEGER"
            required="true"
        />
        <column
            name="rgt"
            type="INTEGER"
            required="true"
        />
        <column
            name="name"
            required="true"
            type="VARCHAR"
            size="255"
        />
        <index name="hierarchy">
            <index-column name="lft" />
            <index-column name="rgt" />
        </index>
    </table>
                
    <table name="masmedia_page" phpName="Page" idMethod="native">
        <column
            name="id"
            required="true"
            primaryKey="true"
            autoIncrement="true"
            type="INTEGER"
        />
        <column
            name="node_id"
            required="false"
            type="INTEGER"
        />
        <foreign-key foreignTable="masmedia_node" onDelete="setnull">
            <reference
                local="node_id"
                foreign="id"        
            />
        </foreign-key>
        <column
            name="user_id"
            required="true"
            type="INTEGER"
        />
        <foreign-key foreignTable="cms_user" onDelete="setnull">
            <reference
                local="user_id"
                foreign="id"        
            />
        </foreign-key>

        <column
            name="tv"
            required="false"
            type="TINYINT"
        />
        <column
            name="heading"
            required="false"
            type="VARCHAR"
            size="255"
        />
        <column
            name="html"
            required="false"
            type="LONGVARCHAR"
        />
        <column
            name="media"
            required="false"
            type="VARCHAR"
            size="255"
        />              
        <column
            name="date_modified"
            required="true"
            type="TIMESTAMP"
        />
        
        <column name="class_key" 
                type="INTEGER" 
                inheritance="single"
                default="4"
                >
            <inheritance key="1" class="HomePage"       extends="tv.masmedia.Page" />
            <inheritance key="2" class="MasmediaPage"   extends="tv.masmedia.Page" />
            <inheritance key="3" class="PeoplePage"     extends="tv.masmedia.Page" />
            <inheritance key="4" class="ProgramsPage"   extends="tv.masmedia.Page" />
            <inheritance key="5" class="IdeasPage"      extends="tv.masmedia.Page" />
            <inheritance key="6" class="ContactPage"    extends="tv.masmedia.Page" />
            <inheritance key="7" class="JobsPage"       extends="tv.masmedia.Page" />
            <inheritance key="8" class="SitemapPage"    extends="tv.masmedia.Page" />
            <inheritance key="9" class="ProgramPage"    extends="tv.masmedia.Page" />
        </column>       
    </table>
</database>


Als je naar de elementnamen kijkt is het idd wel een databasebenadering, maar je kunt het net zo goed als objecten beschouwen.

Maarja nogmaals, je zegt dat je af en toe wat klein grut maakt voor PHP4. Geen idee wat je dan met een full-blown ORM zou moeten. Kijk eens naar CodeIgniter, een lekker simpel en snel MVC framework met een ActiveRecord implementatie, ook voor PHP4...

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Ik gebruik zelf phpdoctrine. Dit is een zeer geavanceerde ORM mapper voor php.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Doctrine supports:

    * Multiple databases
    * Runtime configuration (no XML needed!)
    * Database abstraction with PDO + Doctrine session drivers
    * Database views
    * Column aggregation inheritance as well as class table inheritance
    * Nested transactions
    * UnitOfWork pattern (flexible session flushing)
    * EventListeners
    * Validators
    * Transactional errorStack population with validators
    * Query caching
    * Pessimistic offline locking
    * Transactional query optimization (gathering of DELETE statements)
    * State-wise records and sessions
    * Foreign key relations as well as association table relations
    * Tree structures
    * Association table self-referencing
    * Full data type abstraction
    * Relation aliases
    * PHP Array / Object data types for columns (automatic serialization/unserialization)
    * Enum data type emulation for all databases
    * OO-style query API for both DQL and raw SQL
    * DQL (Doctrine Query Language)
    * LIMIT / OFFSET support
    * Sequence / autoincrement emulation
    * Object population trhough rawsql
    * Proxy fetching
    * Lazy property fetching
    * Composite, Natural and autoincremented identifiers
    * Database query profiling
    * Automatic table creation


De documentatie is redelijk goed en er wordt erg actief aan ontwikkeld. Op het forum worden vragen snel beantwoord.

Simpel voorbeeld: http://www.phpdoctrine.com/documentation.php?index=10.1

Vooral de object query taal van deze orm mapper is ideaal. Werkt er gevoelsmatig. Snelheid is ook goed voor mekaar.

Systeem | Strava


  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

Owja en een groot voordeel van doctrine vind ik dat je niet met xml files te maken hebt. Niet de overhead van het parsen van xml files en weer een syntax minder om te leren.

En toen ik dit gepost had zag ik dat je iets zoekt wat op php4 werkt :X

[ Voor 17% gewijzigd door Brakkie op 28-11-2006 10:38 ]

Systeem | Strava


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Lijkt me meer iets voor SEA ;)

[ Voor 53% gewijzigd door RobIII op 28-11-2006 10:38 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Genoil schreef op dinsdag 28 november 2006 @ 10:31:
Ik weet niet wat je precies bedoelt met 'vanuit de database gezien'. Propel gebruikt een XML schema (geen Schema) voor het genereren van zowel de OM classes als de bijbehorende SQL code. Wat eventueel ook kan is het reverse engineeren van een database naar een XML schema.
Wat ik daarmee bedoel is dat je je database defineert en dat hij daar dan objecten bij gaat maken. Ik zie het liever andersom. Ik bedenk objecten en die wil ik in een database stoppen. Het liefst zou ik hebben dat hij zelf maar kijkt hoe hij dat op wil slaan. Aangezien dat natuurlijk niet echt makkelijk is vindt ik het ook geen probleem om zelf een data model te bedenken en dat door middel van een config file te koppelen.
Maarja nogmaals, je zegt dat je af en toe wat klein grut maakt voor PHP4. Geen idee wat je dan met een full-blown ORM zou moeten. Kijk eens naar CodeIgniter, een lekker simpel en snel MVC framework met een ActiveRecord implementatie, ook voor PHP4...
Op zich heb je daar gelijk in hoor. Het gaat vooral over kleine applicaties waar het waarschijnlijk nog sneller is om het zelf even in te typen dan dat het is om een framework te gebruiken. Het nadeel van het zelf typen is dat als je wat wilt veranderen dat je weer de code in moet duiken. Daar heb ik eigenlijk nooit zo veel zin in. Met een framework kan je dan meestal makkelijker wijzigingen doorvoeren door een config file te wijzigen. Ik zal zeker even naar dat codeigniter kijken. Het gaat hier ook gewoon om een Hobby projectje waar ik het gewoon leuk vindt om dingen uit te proberen. Als het om werk ging had ik al eerder wat gepakt wat beschikbaar was ( En dan had ik het niet in php gedaan ;) )

[ Voor 6% gewijzigd door Woy op 28-11-2006 10:46 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 14:25

Janoz

Moderator Devschuur®

!litemod

Voor kleine dingetjes gebruikte ik nog wel http://titaniclinux.net/daogen/. Sowieso zou ik voor een soort preprocessor gaan. Php is nu eenmaal een taaltje dat alleen maar iets uit kan voeren zodra er een request binnen komt en je wilt niet dat hij voor elk request weer het hele ORM deel ingeladen wordt en de configuratie gecontroleerd wordt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Topicstarter
Iets van een Preprocessor zou inderdaad het best zijn. Ik heb even naar ActiveRecord en CodeIgniter gekeken. En alhoewel het er handig uit ziet en zeker het gedeelte van je queries schrijven vergemakkelijkt ben je nog steeds zelf bezig om je eigen datalaag aan het schrijven. Dat is eigenlijk het gene wat ik wil laten generen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1